この解決策を試してください:
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