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