Probeer deze oplossing:
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
Uitleg:
Dit gebruikt nog steeds een vorm van subquery, maar een die maar één keer wordt uitgevoerd, in tegenstelling tot een die rij voor rij wordt uitgevoerd, zoals in uw oorspronkelijke voorbeeld.
Het werkt door eerst de product_group
. te selecteren id, de fabrikant en het aantal keren dat de fabrikant voor elke specifieke groep voorkomt.
De FROM
sub-select ziet er na uitvoering ongeveer zo uit (verzin hier alleen gegevens):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Nu we het resultaat van de subselectie hebben, moeten we de rij kiezen die het maximum heeft in de occurences
veld voor elke productgroep.
In de buitenste query groeperen we de subselect nogmaals op de product_group
veld, maar deze keer alleen de product_group
veld. Als we nu onze GROUP BY
. doen hier kunnen we een echt boeiende functie in MySQL gebruiken genaamd GROUP_CONCAT
die we kunnen gebruiken om de fabrikanten samen te voegen en in elke gewenste volgorde.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
Wat we hier doen, is de fabrikanten samenvoegen die zijn gegroepeerd per product_group
id, de ORDER BY a.occurrences DESC
zorgt ervoor dat de fabrikant met de meeste verschijningen eerst . verschijnt in de aaneengeschakelde lijst. Ten slotte scheiden we elke fabrikant met :::
. Het resultaat hiervan voor product_group
1
ziet er als volgt uit:
XYZ:::Test:::Singleton
XYZ
verschijnt als eerste omdat het de hoogste waarde heeft in de occurance
veld. Wij alleen wil XYZ
selecteren , dus we omsluiten de aaneenschakeling in SUBSTRING_INDEX
, waardoor we alleen het eerste element van de lijst kunnen kiezen op basis van de :::
scheidingsteken.
Het eindresultaat is:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran