2009-10-22 52 views
2

我有我想要的結果表格中顯示:什麼是查詢位置變化的最佳方式?

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

變化欄反映的是人的位置移動,所以從第3移動到第二點是+1,並從第二移動到第三是-1等。因此在上面的例子中,自從上一場比賽Tom取代Sam之後。

我可以編寫一個提供結果(包括「更改」列)的單個SQL語句嗎?

現在我正在寫兩個查詢來做到這一點。我得到不包括最新遊戲的分數,然後獲得包括最新遊戲在內的分數,並在繪製表格時進行比較。

實施例:

上一頁遊戲結果

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 2009-10-22 12:04:33

相關問題