Prøv denne løsning:
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
Forklaring:
Dette bruger stadig en form for underforespørgsel, men en, der kun udføres én gang i modsætning til en, der udføres på række-for-række-basis som i dit oprindelige eksempel.
Det fungerer ved først at vælge product_group id, producenten og antallet af, hvor mange gange producenten optræder for hver bestemt gruppe.
FROM sub-select vil se nogenlunde sådan ud efter udførelse (bare at lave data her):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Nu hvor vi har undervalgsresultatet, skal vi udvælge den række, der har maksimum i occurences felt for hver produktgruppe.
I den ydre forespørgsel grupperer vi subselect igen efter product_group felt, men denne gang kun product_group Mark. Når vi nu laver vores GROUP BY her kan vi bruge en virkelig overbevisende funktion i MySQL kaldet GROUP_CONCAT som vi kan bruge til at sammenkæde producenterne sammen og i hvilken som helst rækkefølge, vi ønsker.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
Det, vi gør her, er at sammenkæde producenterne sammen, der er grupperet efter product_group id, ORDER BY a.occurrences DESC sørger for, at producenten med flest optrædener vises først i den sammenkædede liste. Endelig adskiller vi hver producent med ::: . Resultatet af dette for product_group 1 vil se sådan ud:
XYZ:::Test:::Singleton
XYZ vises først, da den har den højeste værdi i occurance Mark. Vi kun ønsker at vælge XYZ , så vi omslutter sammenkædningen i SUBSTRING_INDEX , hvilket vil tillade os kun at vælge det første element på listen baseret på ::: afgrænsning.
Slutresultatet bliver:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran