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