sql >> Database teknologi >  >> RDS >> Mysql

MySQL - vælg rang for brugere i en scoretabel

Selvom jeg ikke er sikker på, hvad "problematisk" betyder i denne sammenhæng, her er forespørgslen omskrevet som en almindelig LEFT JOIN med en underforespørgsel bare for at få rangeringen lige til sidst (ORDER BY skal gøres før rangeringen);

SELECT user_id, score, @rank := @rank + 1 AS rank FROM
(
  SELECT u.user_id, u.score
  FROM user_score u
  LEFT JOIN user_score u2
    ON u.user_id=u2.user_id
   AND u.`timestamp` < u2.`timestamp`
  WHERE u2.`timestamp` IS NULL
  ORDER BY u.score DESC
) zz, (SELECT @rank := 0) z;

En SQLfiddle at teste med .

EDIT:For at tage group_id i betragtning, skal du udvide forespørgslen noget;

SELECT user_id, score, @rank := @rank + 1 AS rank FROM
(
  SELECT u.user_id, u.score
  FROM user_score u
  LEFT JOIN user_score u2
    ON u.user_id=u2.user_id
   AND u.group_id = u2.group_id       -- u and u2 have the same group
   AND u.`timestamp` < u2.`timestamp`
  WHERE u2.`timestamp` IS NULL
    AND u.group_id = 1                -- ...and that group is group 1
  ORDER BY u.score DESC
) zz, (SELECT @rank := 0) z;

En anden SQLfiddle .



  1. Hvordan kan jeg vælge * fra en tabel i MySQL, men udelade bestemte kolonner?

  2. Sådan tjekker du din MySQL-version

  3. SQL UNION ALL for at eliminere dubletter

  4. Hvad er implikationerne af at åbne MySQL-forbindelser igen og igen i PHP