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

MYSQL-制限によるグループ化

    MySQLには簡単な方法はないと思います。これを行う1つの方法は、rating_nameによってグループに分割された各行の行番号を生成し、row_number2以下の行のみを選択することです。ほとんどのデータベースでは、次のようなものを使用してこれを行うことができます:

    SELECT * FROM (
        SELECT
            rating_name,
            etc...,
            ROW_NUMBER() OVER (PARTITION BY rating_name ORDER BY good) AS rn
        FROM your_table
    ) T1
    WHERE rn <= 2
    

    残念ながら、MySQLはROW_NUMBERをサポートしていません 構文。ただし、ROW_NUMBERをシミュレートすることはできます 変数の使用:

    SELECT
        rating_name, id_markets, good, neutral, bad
    FROM (
        SELECT
            *,
            @rn := CASE WHEN @prev_rating_name = rating_name THEN @rn + 1 ELSE 1 END AS rn,
            @prev_rating_name := rating_name
        FROM (
            SELECT
                rating_name,
                id_markets,
                SUM(COALESCE(rating_good, 0)) AS good,
                SUM(COALESCE(rating_neutral, 0)) AS neutral,
                SUM(COALESCE(rating_bad, 0)) AS bad
            FROM zzratings
            WHERE rating_year = YEAR(CURDATE()) AND rating_week = WEEK(CURDATE(), 1)
            GROUP BY rating_name, id_markets
        ) AS T1, (SELECT @prev_rating_name := '', @rn := 0) AS vars
        ORDER BY rating_name, good DESC
    ) AS T2
    WHERE rn <= 2
    ORDER BY rating_name, good DESC
    

    テストデータで実行した場合の結果:

    france    1  2  0  0
    france    2  1  0  0
    ireland   1  4  2  0
    ireland  21  3  1  0
    poland    1  3  1  0
    poland    2  1  0  0
    


    1. PDOを使用した行数

    2. T-SQLを使用してSQLServerインスタンスの非推奨機能を一覧表示する方法

    3. mysqlテーブル名で(-)ダッシュを使用する

    4. MariaDB USER()の説明