Wypróbuj to rozwiązanie:
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
Wyjaśnienie:
To nadal używa formy podzapytania, ale takiej, która jest wykonywana tylko raz, w przeciwieństwie do takiej, która jest wykonywana wiersz po wierszu, jak w oryginalnym przykładzie.
Działa, wybierając najpierw product_group
id, producent i ile razy producent pojawia się dla każdej konkretnej grupy.
FROM
sub-select będzie wyglądał mniej więcej tak po wykonaniu (po prostu uzupełnij dane tutaj):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Teraz, gdy mamy wynik podwyboru, musimy wybrać wiersz, który ma maksimum w occurences
pole dla każdej grupy produktów.
W zewnętrznym zapytaniu ponownie grupujemy podselekcję według product_group
pole, ale tym razem tylko product_group
pole. Teraz, gdy wykonamy nasze GROUP BY
tutaj możemy użyć naprawdę atrakcyjnej funkcji w MySQL o nazwie GROUP_CONCAT
których możemy użyć do połączenia producentów razem i w dowolnej kolejności.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
To, co robimy tutaj, to łączenie producentów razem, którzy są pogrupowani według product_group
id, ORDER BY a.occurrences DESC
upewnia się, że producent z największą liczbą występów pojawia się pierwszy na połączonej liście. Na koniec oddzielamy każdego producenta za pomocą :::
. Wynik tego dla product_group
1
będzie wyglądać tak:
XYZ:::Test:::Singleton
XYZ
pojawia się jako pierwszy, ponieważ ma najwyższą wartość w occurance
pole. My tylko chcesz wybrać XYZ
, więc zamykamy konkatenację w SUBSTRING_INDEX
, co pozwoli nam wybrać tylko pierwszy element listy na podstawie :::
ogranicznik.
Efektem końcowym będzie:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran