4

好的,我尝试了几种方法来做到这一点,但它们都不起作用,所以我没有要显示的代码。但我会尽我所能解释这一点。

我有一个比赛脚本,我想添加一行,向用户显示他们在当前获胜者列表下的位置。所以我希望桌子看起来像这样。

-----------------------------------------
| Place |    User   | Prize | Completed |
|   1   | Someuser1 | $5.00 |     5     |
|   2   | Someuser2 | $2.50 |     3     |
|   3   | Someuser3 | $1.25 |     2     |
|   20  |    You    |  ---  |     1     |
-----------------------------------------

我拥有所谓的某些用户的一切,但我希望能够计算正在查看页面的当前用户可以看到他们在比赛中的位置。我可以运行什么样的查询来获取当前用户所在的位置。

我希望没有代码就有意义。

表结构

    Column   |  Type | Null |  Default
--------------------------------------
    id       |int(11)|  No  |   
    username |text   |  No  |   
    completed|int(11)|  No  |   
4

2 回答 2

2

有几种方法可以做到这一点。一种是计算有多少行的排名高于给定行:

SELECT COUNT(*) AS Place, t.*
FROM TheTable t
LEFT OUTER JOIN TheTable t2 ON t.Prize < t2.Prize
GROUP BY t.id
HAVING Place <= 3 OR user = 'You';

另一种是使用会话变量来跟踪排名:

SELECT * FROM (
  SELECT (@row := COALESCE(@row, 0)+1) AS Place, t.*
  FROM TheTable t
  ORDER BY Prize DESC) r
WHERE Place <= 3 OR user = 'You';
于 2012-11-24T23:49:48.323 回答
0

好的,据我了解,我可以想到两种方法。

  1. 有 2 个查询。第一个查询获得前 3 个,然后一个查询获得用户位置

    # First query to get top three
    
    if (  user not in top three) {
         $db->prepare('SELECT whatever FROM table WHERE user = ?')->execute(array($user));
    }
    
  2. 检索所有结果,显示前三个并与当前用户一起显示一个。

编辑:比尔的回答似乎更好:)

于 2012-11-24T23:49:11.767 回答