Hãy thử giải pháp này:
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
Giải thích:
Điều này vẫn sử dụng một dạng truy vấn con, nhưng một truy vấn chỉ thực thi một lần thay vì một truy vấn thực thi trên cơ sở từng hàng, chẳng hạn như trong ví dụ ban đầu của bạn.
Nó hoạt động bằng cách chọn product_group
trước tiên id, nhà sản xuất và số lần nhà sản xuất xuất hiện cho mỗi nhóm cụ thể.
FROM
sub-select sẽ trông giống như thế này sau khi thực thi (chỉ tạo dữ liệu ở đây):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
Bây giờ chúng ta có kết quả chọn phụ, chúng ta cần chọn hàng có giá trị tối đa trong occurences
cho từng nhóm sản phẩm.
Trong truy vấn bên ngoài, chúng tôi nhóm lựa chọn con lại một lần nữa theo product_group
nhưng lần này, chỉ product_group
đồng ruộng. Bây giờ khi chúng tôi thực hiện GROUP BY
ở đây, chúng ta có thể sử dụng một hàm thực sự hấp dẫn trong MySQL có tên là GROUP_CONCAT
mà chúng tôi có thể sử dụng để kết hợp các nhà sản xuất với nhau và theo bất kỳ thứ tự nào chúng tôi muốn.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
Những gì chúng tôi đang làm ở đây là nối các nhà sản xuất với nhau được nhóm lại với nhau theo product_group
id, ORDER BY a.occurrences DESC
đảm bảo rằng nhà sản xuất có nhiều lần xuất hiện nhất sẽ xuất hiện đầu tiên trong danh sách nối. Cuối cùng, chúng tôi phân tách từng nhà sản xuất bằng :::
. Kết quả của việc này cho product_group
1
sẽ giống như sau:
XYZ:::Test:::Singleton
XYZ
xuất hiện đầu tiên vì nó có giá trị cao nhất trong occurance
đồng ruộng. Chúng tôi chỉ muốn chọn XYZ
, vì vậy chúng tôi mã hóa phần nối trong SUBSTRING_INDEX
, điều này sẽ cho phép chúng tôi chỉ chọn phần tử đầu tiên của danh sách dựa trên :::
dấu phân cách.
Kết quả cuối cùng sẽ là:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran