Versuchen Sie diese Lösung:
SELECT
a.product_group,
SUBSTRING_INDEX(GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'), ':::', 1) AS manufacturer_mode
FROM
(
SELECT
aa.product_group,
aa.manufacturer,
COUNT(*) AS occurrences
FROM
products aa
GROUP BY
aa.product_group,
aa.manufacturer
) a
GROUP BY
a.product_group
Erklärung:
Dies verwendet immer noch eine Form von Unterabfrage, aber eine, die nur einmal ausgeführt wird, im Gegensatz zu einer, die Zeile für Zeile ausgeführt wird, wie in Ihrem ursprünglichen Beispiel.
Es funktioniert, indem Sie zuerst die product_group
auswählen id, der Hersteller und die Anzahl, wie oft der Hersteller für jede bestimmte Gruppe vorkommt.
Der FROM
Unterauswahl sieht nach der Ausführung etwa so aus (hier nur Daten erfinden):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Nachdem wir nun das Sub-Select-Ergebnis haben, müssen wir die Zeile mit dem Maximum in den occurences
auswählen Feld für jede Produktgruppe.
In der äußeren Abfrage gruppieren wir den Subselect noch einmal nach product_group
Feld, aber diesmal nur die product_group
aufstellen. Wenn wir jetzt unser GROUP BY
machen Hier können wir eine wirklich überzeugende Funktion in MySQL namens GROUP_CONCAT
verwenden die wir verwenden können, um die Hersteller miteinander und in beliebiger Reihenfolge zu verketten.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
Was wir hier tun, ist die Verkettung der Hersteller, die nach product_group
gruppiert sind id, der ORDER BY a.occurrences DESC
sorgt dafür, dass der Hersteller mit den meisten Auftritten zuerst erscheint in der verketteten Liste. Abschließend trennen wir jeden Hersteller mit :::
. Das Ergebnis davon für product_group
1
sieht so aus:
XYZ:::Test:::Singleton
XYZ
erscheint zuerst, da es den höchsten Wert im occurance
hat aufstellen. Wir nur XYZ
auswählen möchten , also schließen wir die Verkettung in SUBSTRING_INDEX
ein , wodurch wir nur das erste Element der Liste basierend auf :::
auswählen können Trennzeichen.
Das Endergebnis wird sein:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran