このソリューションを試してください:
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