Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Converter seleções UNION para seleção única com loop no MySQL


No MySQL (antes de 8.0), você pode usar variáveis ​​para isso:
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;

Na versão 8.0+, use row_number() o método padrão ANSI para esta funcionalidade.

Notas:
  • Nunca use vírgulas no FROM cláusula. Sempre use JOIN apropriado e explícito sintaxe.
  • Use aliases de tabela que são as abreviações das colunas que você está usando.
  • Qualifique todos os nomes de coluna nas consultas que você está usando, especialmente quando o FROM cláusula faz referência a mais de uma tabela.