在使用where和order by语句时从数据库获取行号

时间:2012-11-24 23:38:04

标签: php mysql

好的我已经尝试了几种方法来做到这一点,但它们都没有用,所以我没有代码可以显示。但我会尽力解释这一点。

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

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

2 个答案:

答案 0 :(得分: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';

答案 1 :(得分: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. 检索所有结果,显示前三位并显示当前用户的结果。

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