簡體   English   中英

查詢職位變動的最佳方法是什么?

[英]What's the best way to query for position changes?

我有一張要顯示的結果表:

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

更改列反映了人的位置移動,因此從第三名到第二名的移動是+1,從第二名到第三名的移動是-1等。因此在上面的示例中,由於湯姆上一場超越了薩姆。

我可以編寫一條提供結果(包括“更改”列)的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
}

這很好用-但是如果我只使用一個語句而不是兩個語句,我會感覺更好。

試試這個:

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:=@rank1+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:=@rank2+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

(我還沒有測試!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM