この解決策を試してください:
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
することです。これにより、最も多くの外観を持つ製造業者が連結リストの最初に表示されるようになります。最後に各メーカーを で区切ります:::
。この for の結果は次のproduct_group
1
ようになります。
XYZ:::Test:::Singleton
XYZ
フィールドで最も高い値を持つため、最初に表示されoccurance
ます。のみを選択したいXYZ
ので、連結を で囲みます。これにより、区切り記号SUBSTRING_INDEX
に基づいてリストの最初の要素のみを選択できます。:::
最終結果は次のようになります。
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran