php - 查询位置变化的最佳方式是什么?

标签 php mysql

我有一个要显示的结果表:

| 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/

相关文章:

php - SQLSTATE[42S22] : Column not found: 1054 Unknown column 'id' in 'where clause' Id is null

php - 如何插入 php 代码以防止在 mysql 中重复输入?

PHP MYSQL 返回结果两次(Double)

php - PHP Web 应用程序中的日期时间(时区)

mysql - 如何将.mysql文件导入MySQL数据库?

php - 从第一个表中提取数据并使用其值从其他表中提取数据

PHP 在某些点拆分字符串

php - CSS 在 PHP 代码后丢失属性?

php - echo php 变量可以在外部 javascript 上吗?

php - PHP 检查 if 语句有多远?