sql >> Databasteknik >  >> RDS >> Mysql

Uppdatera en MySQL-tabell med rekordrankningar inom grupper

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

count(*) kommer att utvärderas till noll även när inga rader matchar villkoret, dvs. topprankingen. Om du ville ha en tät rang kan du göra så här:

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:Enligt din kommentar har jag hittat en fråga som fungerar. (Det fungerar på SQL Server och jag är inte bekant med MySQL:s egenheter.) 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. MySQL BESTÄLLNING EFTER IN()

  2. Vad är beteendet för minusoperatorn mellan två datumtider i MySQL?

  3. PHP - Hur man verifierar att posten har raderats framgångsrikt

  4. NVL() Funktion i Oracle