このソリューションを試してください:
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
説明:
これは引き続きサブクエリの形式を使用しますが、元の例のように行ごとに実行されるものとは対照的に、1回だけ実行されるものです。
最初に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