Prova den här lösningen:
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
Förklaring:
Detta använder fortfarande en form av underfråga, men en som körs endast en gång i motsats till en som körs rad för rad, som i ditt ursprungliga exempel.
Det fungerar genom att först välja product_group
id, tillverkaren och antalet gånger tillverkaren visas för varje särskild grupp.
FROM
sub-select kommer att se ut ungefär så här efter körning (bara att skapa data här):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Nu när vi har undervalsresultatet måste vi välja ut raden som har maximalt antal occurences
för varje produktgrupp.
I den yttre frågan grupperar vi undervalet igen efter product_group
fältet, men den här gången endast product_group
fält. Nu när vi gör vår GROUP BY
här kan vi använda en riktigt övertygande funktion i MySQL som heter GROUP_CONCAT
som vi kan använda för att sammanfoga tillverkarna och i vilken ordning vi vill.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
Vad vi gör här är att sammanfoga tillverkarna som är grupperade per product_group
id, ORDER BY a.occurrences DESC
ser till att tillverkaren med flest framträdanden visas först i den sammanlänkade listan. Slutligen separerar vi varje tillverkare med :::
. Resultatet av detta för product_group
1
kommer att se ut så här:
XYZ:::Test:::Singleton
XYZ
visas först eftersom det har det högsta värdet i occurance
fält. Vi bara vill välja XYZ
, så vi omsluter sammanlänkningen inom SUBSTRING_INDEX
, vilket gör att vi bara kan välja det första elementet i listan baserat på :::
avgränsare.
Slutresultatet blir:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran