我有一个要显示的结果表:
| change | position | name | score |
|----------------------------------|
| - | 1 | Bob | 10 |
| +1 | 2 | Tom | 8 |
| -1 | 3 | Sam | 7 |
|----------------------------------|
变化列反射(reflect)了人的位置移动,所以从第 3 位移动到第 2 位是 +1,从第 2 位移动到第 3 位是 -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
(我没有测试过!)
关于php - 查询位置变化的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606605/