嘗試這種解決方案:
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
子選擇會看起來像這樣執行後(只是做了數據在這裏):
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
的'SUBSTRING_INDEX(GROUP_CONCAT('實在是太醜了,但我真的很喜歡的方式它被用來回答這個問題。+1:p –
順便說一下,在這裏不處理同一產品的同等事件的情況不是嗎? –
@OlivierCoilland,這個問題沒有說明應該如何處理同等事件。現在如果有的話,它會選擇第一個出現。也許OP想要根據一個額外的字段對它進行排序,這隻需要在GROUP_CONCAT()的ORDER BY中添加另一個字段。 –