sql >> Database >  >> RDS >> Mysql

MySQL:SELECTEER een winnaar en geef hun rang terug

Ik denk dat je hiermee het gewenste resultaat krijgt. Merk op dat ik op de juiste manier omgaat met gevallen waarin de beoogde winnaar gelijk staat voor punten met een andere winnaar. (Beiden krijgen dezelfde positie).

SELECT COUNT(*) + 1 AS Position
FROM myTable
WHERE Points > (SELECT Points FROM myTable WHERE Winner = 'Sally')

Bewerken :
Ik wil Ignacio Vazquez-Abrams "aansluiten" ' antwoord dat op verschillende manieren beter is dan het bovenstaande.
Het maakt het bijvoorbeeld mogelijk om alle (of meerdere) winnaars en hun huidige positie op te sommen.
Een ander voordeel is dat het een meer gecompliceerde voorwaarde kan uitdrukken om aan te geven dat een bepaalde speler voor is op een andere (zie hieronder). incrediman lezen 's opmerking dat er geen "banden" zullen zijn, heeft me ertoe aangezet dit te onderzoeken; de zoekopdracht kan als volgt enigszins worden gewijzigd om de situatie aan te pakken wanneer spelers hetzelfde aantal punten hebben (dergelijke spelers zouden voorheen dezelfde positiewaarde hebben gekregen, nu is de positiewaarde verder gekoppeld aan hun relatieve startwaarden).

SELECT w1.name, (
  SELECT COUNT(*)
  FROM winners AS w2
  WHERE (w2.points > w1.points) 
     OR (W2.points = W1.points AND W2.Start < W1.Start)  -- Extra cond. to avoid ties.
)+1 AS rank
FROM winners AS w1
-- WHERE W1.name = 'Sally'   -- optional where clause


  1. Hoe Event Scheduler in te schakelen wanneer ik MySQL Server open?

  2. Hoe kan ik PostgreSQL upgraden van versie 9.6 naar versie 10.1 zonder gegevens te verliezen?

  3. Hoe ORA-01775 te debuggen:een reeks synoniemen in een lus?

  4. ontvang succes/mislukkingsreactie van mysqli_query