Опитайте това решение:
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
Обяснение:
Това все още използва форма на подзаявка, но такава, която се изпълнява само веднъж, за разлика от тази, която се изпълнява на база ред по ред, както във вашия оригинален пример.
Работи, като първо изберете product_group
id, производителят и броя на появяванията на производителя за всяка отделна група.
FROM
sub-select ще изглежда по следния начин след изпълнение (просто съставяне на данни тук):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Сега, когато имаме резултата от подизбора, трябва да изберем реда, който има най-много occurences
поле за всяка продуктова група.
Във външната заявка ние групираме подизбора още веднъж по product_group
поле, но този път само product_group
поле. Сега, когато правим нашето GROUP BY
тук можем да използваме една наистина завладяваща функция в MySQL, наречена GROUP_CONCAT
които можем да използваме, за да свържем производителите заедно и във всеки ред, който пожелаем.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
Това, което правим тук, е да обединим заедно производителите, които са групирани заедно по product_group
id, ORDER BY a.occurrences DESC
гарантира, че производителят с най-много изяви се появява първи в свързания списък. Накрая разделяме всеки производител с :::
. Резултатът от това за product_group
1
ще изглежда така:
XYZ:::Test:::Singleton
XYZ
се появява първо, тъй като има най-високата стойност в occurance
поле. Само ние искате да изберете XYZ
, така че обграждаме конкатенацията в SUBSTRING_INDEX
, което ще ни позволи да изберем само първия елемент от списъка въз основа на :::
разделител.
Крайният резултат ще бъде:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran