sql >> Database >  >> RDS >> Mysql

Converteer UNION-selecties naar enkele selectie met lus in MySQL

In MySQL (vóór 8.0) kun je hiervoor variabelen gebruiken:

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;

Gebruik in 8.0+ row_number() de ANSI-standaardmethode voor deze functionaliteit.

Opmerkingen:

  • Nooit gebruik komma's in de FROM clausule. Altijd gebruik de juiste, expliciete JOIN syntaxis.
  • Gebruik tabelaliassen die de afkortingen zijn voor de kolommen die u gebruikt.
  • Kwalificeer alle kolomnamen in de zoekopdrachten die u gebruikt, vooral wanneer de FROM clausule verwijst naar meer dan één tabel.


  1. Onder welke omstandigheden verhoogt ROWNUM=1 de prestaties in een bestaande syle-query aanzienlijk?

  2. welke mysql-query moet ik gebruiken om een ​​categorie te selecteren die overeenkomt met AL mijn criteria?

  3. DBMS_JOB versus DBMS_SCHEDULER

  4. WhereRaw Laravel met variabele