sql >> Databasteknik >  >> RDS >> Mysql

Konvertera UNION-val till enkelval med loop i MySQL

I MySQL (före 8.0) kan du använda variabler för detta:

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;

I 8.0+, använd row_number() ANSI-standardmetoden för denna funktionalitet.

Anmärkningar:

  • Aldrig använd kommatecken i FROM klausul. Alltid använd korrekt, explicit JOIN syntax.
  • Använd tabellalias som är förkortningarna för de kolumner du använder.
  • Kvalificera alla kolumnnamn i de frågor som du använder, särskilt när FROM klausul refererar till mer än en tabell.


  1. Databaskontrollpunkter i SQL Server

  2. libpqxx v12 - binder dynamiskt vektorvärden till förberedd sats (alternativ till anrop)

  3. Hur gör man en Postgresql-underfråga i select-sats med join in från-klausul som SQL Server?

  4. MYSQL &innoDB ändrar dynamiskt AUTO_INCREMENT av en tabell