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

UNION選択をMySQLのループ付き単一選択に変換する

    MySQL(8.0より前)では、これに変数を使用できます:

    select genre_name, actor_id, cnt
    from (select genre_name, actor_id, cnt,
                 (@rn := if(@g = genre_name, @rn + 1,
                            if(@g := genre_name, 1, 1)
                           )
                 ) as rn
          from (select g.genre_name, r.actor_id, count(*) as cnt
                from movie m join
                     role r
                     on r.movie_id = m.movie_id join
                     movie_has_genre mhg
                     on mhg.movie_id = m.movie_id join
                     genre g
                     on g.genre_id = mhg.genre_id
                group by g.genre_name, r.actor_id
                order by g.genre_name, cnt desc
               ) ga cross join
               (select @g := '', @rn := 0) params
          ) ga
    where rn <= 3;
    

    8.0以降では、row_number()を使用します この機能のANSI標準方式。

    注:

    • 決して FROMではカンマを使用します 句。 常に 適切で明示的なJOINを使用する 構文。
    • 使用している列の省略形であるテーブルエイリアスを使用します。
    • 特にFROMの場合、使用しているクエリのすべての列名を修飾します 句は複数のテーブルを参照します。


    1. MS SQLServer2017標準でのフェイルオーバーの実装

    2. SQL *PlusCSVエクスポートはSQLDeveloperよりも遅い

    3. 空白(nullではない)フィールドの場合はCOALESCE()

    4. PostgreSQLのブールデータ型に対してt/fの代わりにyes/noを出力します