Coba solusi ini:
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
Penjelasan:
Ini masih menggunakan bentuk subquery, tetapi yang dijalankan hanya sekali, berbeda dengan yang dijalankan berdasarkan baris demi baris seperti dalam contoh asli Anda.
Ia bekerja dengan terlebih dahulu memilih product_group
id, pabrikan, dan hitungan berapa kali pabrikan muncul untuk setiap grup tertentu.
FROM
sub-pilih akan terlihat seperti ini setelah eksekusi (hanya membuat data di sini):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Sekarang kita memiliki hasil sub-pilih, kita perlu memilih baris yang memiliki maksimum occurences
untuk setiap grup produk.
Di kueri luar, kami mengelompokkan subpilihan sekali lagi dengan product_group
lapangan, tapi kali ini, hanya product_group
bidang. Sekarang ketika kita melakukan GROUP BY
di sini, kita dapat menggunakan fungsi yang sangat menarik di MySQL yang disebut GROUP_CONCAT
yang dapat kita gunakan untuk menggabungkan produsen bersama-sama dan dalam urutan apa pun yang kita inginkan.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
Apa yang kami lakukan di sini adalah menggabungkan produsen yang dikelompokkan bersama per product_group
id, ORDER BY a.occurrences DESC
memastikan bahwa pabrikan dengan penampilan paling banyak muncul pertama dalam daftar gabungan. Akhirnya kami memisahkan setiap produsen dengan :::
. Hasil dari ini untuk product_group
1
akan terlihat seperti:
XYZ:::Test:::Singleton
XYZ
muncul pertama kali karena memiliki nilai tertinggi di occurance
bidang. Kami hanya ingin memilih XYZ
, jadi kami membungkus rangkaian dalam SUBSTRING_INDEX
, yang akan memungkinkan kita untuk hanya memilih elemen pertama dari daftar berdasarkan :::
pembatas.
Hasil akhirnya adalah:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran