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

いくつかのルールに基づいて行を選択する

    このデモでは、すべてのテストケースを同じテーブルにまとめました。ここで、ケース1、2、3の正しい結果を確認できます。ケース4、5の場合は、変更が必要です。@language := 'de' 'es'へ 。

    最終バージョンでは、@partitionは必要ありません 、@userのみ 。

    基本的にこれは@Gordonと同じソリューションですが、row_number()を使用できないためです。 ユーザー変数を使用してエミュレートします。

    SQLデモ

    SELECT *
    FROM (
          SELECT t.*,
                 @rn := if (@partition = CONCAT(`test_id`, '-', `user`),
                            @rn + 1,
                            if(@partition := CONCAT(`test_id`, '-', `user`), 1, 1)
                           ) as rn,
                 @partition           
          FROM (
            SELECT *, (language = @language) AS priority
            FROM Table1
            CROSS JOIN (SELECT @language := 'de' as site_lang) AS var
            ORDER BY CONCAT(test_id, '-', user),
                    priority DESC,
                    created
          ) AS t
          CROSS JOIN ( SELECT @rn := 0, @partition := '' ) as var
        ) r
    WHERE r.rn = 1;
    

    出力

    @language := 'de'を使用 最初の3つのテストケース。

    | test_id | id | title | language |              created | user | site_lang | priority | rn | @partition |
    |---------|----|-------|----------|----------------------|------|-----------|----------|----|------------|
    |       1 |  3 |     c |       de | 2019-01-03T00:00:00Z |    4 |        de |        1 |  1 |        1-4 |
    |       2 |  1 |     a |       en | 2019-01-01T00:00:00Z |    4 |        de |        0 |  1 |        2-4 |
    |       3 |  1 |     a |       en | 2019-01-01T00:00:00Z |    3 |        de |        0 |  1 |        3-3 |
    |       3 |  3 |     b |       de | 2019-01-03T00:00:00Z |    4 |        de |        1 |  1 |        3-4 |
    |       3 |  4 |     c |       de | 2019-01-04T00:00:00Z |    5 |        de |        1 |  1 |        3-5 |
    


    1. MySQLの列を更新します

    2. C#を使用してMysqlに接続するにはどうすればよいですか?

    3. データモデラーの目で休日を表示する

    4. MySQLPHPでのソート距離