4

私のアプリケーションでは、各製品グループには多くの製品があり、各製品には 1 つのメーカーがあります。これらのリレーションは、MySQL によってproduct_groupsidフィールド、 、および フィールドを含むproductsInnoDBテーブルに格納されます。idproduct_groupmanufacturer

サブクエリを選択せず​​に、各製品グループで最も一般的なメーカーを見つける方法はありますか?

これは私が現在やっている方法です:

SELECT product_groups.id,
  (
    SELECT manufacturer FROM products
    WHERE product_group = product_groups.id
    GROUP BY manufacturer
    ORDER BY count(*) DESC
    LIMIT 1
  ) manufacturer_mode
FROM product_groups;
4

1 に答える 1

5

この解決策を試してください:

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
于 2012-06-27T10:38:18.890 に答える