sql >> Database >  >> RDS >> Mysql

Update een MySQL-tabel met recordrangschikkingen binnen groepen

update winners
set rank = (
    select count(score) + 1
    from winners w2
    where w2.category_id = winners.category_id and w2.score > winners.score
)

count(*) zal evalueren tot nul, zelfs als er geen rijen overeenkomen met de voorwaarde, d.w.z. de hoogste ranking. Als je een dichte rang wilde, zou je dit kunnen doen:

update winners
set rank = (
    select count(distinct score) + 1
    from winners w2
    where w2.category_id = winners.category_id and w2.score > winners.score
)

EDIT:Volgens uw opmerking heb ik een zoekopdracht gevonden die wel werkt. (Het werkt op SQL Server en ik ben niet bekend met de eigenaardigheden van MySQL.) http:// sqlfiddle.com/#!9/1159f/1

update winners
inner join (
    select w.id, w.category_id, count(w2.score) + 1 rank
    from winners w left outer join winners w2
        on w2.category_id = w.category_id and w2.score > w.score
    group by w.id
) r
    on r.id = winners.id
set winners.rank = r.rank



  1. PHP naar MySQL SSL-verbindingen

  2. Database maken bij opstarten docker-compose

  3. Een database automatisch comprimeren en repareren in Access 2016

  4. codeigniter voegt de IS NULL toe aan de find_in_set