2009-10-22 5 views
2

У меня есть таблица результатов, которые я хотел бы показать:Каков наилучший способ запроса изменений позиции?

| change | position | name | score | 
|----------------------------------| 
| - |  1 | Bob | 10 | 
| +1 |  2 | Tom | 8 | 
| -1 |  3 | Sam | 7 | 
|----------------------------------| 

Столбец изменение отражает движение положения человека, поэтому переход от 3-го до 2-го является +1, и переход от 2-го до третьего является -1 и т. Д. Итак, в приведенном выше примере, поскольку последняя игра Тома обогнала Сэма.

Могу ли я написать один оператор SQL, который содержит результаты, включая столбец «change»?

Сейчас я пишу два запроса для этого. Я получаю оценки за исключением последней игры, а затем получаю оценки, включая последнюю игру, и сравниваю, когда я рисую таблицу.

Пример:

Предыдущая игра Результаты:

SELECT p.name, p.id, SUM(g.points) AS score 
FROM players p INNER JOIN games g ON p.id=g.player_id 
WHERE g.id<5 
ORDER BY score DESC 

затем хранить их в массиве:

$i=1; 
while($row = mysql_fetch_assoc($results){ 
    $prevPositions[$row['id']] = $i++; 
    //render row 
} 

Все игры Результаты:

SELECT p.name, SUM(g.points) AS score 
FROM players p INNER JOIN games g ON p.id=g.player_id 
ORDER BY score DESC 

А потом разработка разницы при визуализации таблицы:

$i=1; 
while($row = mysql_fetch_assoc($results){ 
    $change = $prevPositions[$row['id']] - $i++; 
    //render row 
} 

Это прекрасно работает - но я чувствовал бы себя лучше, если бы я мог использовать только один оператор, а не два.

ответ

1

Попробуйте это:

SELECT (S0.Rank - S1.Rank) As Change, S1.Rank As Position, S1.name, S1.score 
FROM (SELECT p.name, p.id, SUM(g.points) AS score, @rank1:[email protected]+1 As rank 
     FROM (SELECT @rank1:=0) r, players p 
     INNER JOIN games g ON p.id=g.player_id 
     ORDER BY score DESC) S1 
JOIN 
    (SELECT p.id, SUM(g.points) AS score, @rank2:[email protected]+1 As rank 
     FROM (SELECT @rank2:=0) r, players p 
     INNER JOIN games g ON p.id=g.player_id 
     WHERE g.id<5 
     ORDER BY score DESC) S0 
ON S0.id = s1.id 

(я не проверял!)

+0

Я не буду иметь возможность не испытать выше до следующей недели, но спасибо за предложение. – Vamos

Смежные вопросы