sql >> データベース >  >> RDS >> Mysql

MySQLのサブクエリフィールドなしのモード計算?

    このソリューションを試してください:

    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
    



    1. SQLテーブル内の単一の文字の照合に問題がある

    2. MySQLデータベースに保存されているバイト配列のクラスを知る必要があります

    3. 選択値とハードコードされた値を使用したSQL挿入

    4. APEX_ZIPの例