PHP MYSQL使用order by子句从表中查找行号/等级

时间:2014-01-11 14:45:18

标签: php mysql sql-order-by row rank

现在这已经好几个小时了。看起来很简单,但我找不到答案。

基本上我有以下示例数据的MYSQL表,注意还有其他列,但这个问题不是必需的。

id | x  | y  
1  | 50 | 3
2  | 40 | 1
3  | 50 | 0
4  | 50 | 1
5  | 40 | 2


我想通过x DESC和第二个DESC来订购表。所以我有这个:

SELECT id, x, y FROM table_name ORDER BY x DESC, y DESC

希望结果如下:

id | x  | y  
1  | 50 | 3
4  | 50 | 1
3  | 50 | 0
5  | 40 | 2
2  | 40 | 1


然后给定存储在变量中的特定id,我希望能够找到在给定查询时找到的行号。即查找在其他行中排名的位置。 我知道有一个RANK和DENSE_RANK,如果我需要使用我需要的RANK。但如果使用那不是最好的解决方案,或者如何使用RANK请帮忙。

对于上面的数据,如果我的id变量$ id = 4,它的排名将是2,因为它排序第二。 我需要将此值作为变量返回。感谢

2 个答案:

答案 0 :(得分:3)

MySQL不支持窗口/分析功能。您可以使用变量或复杂的子查询来模拟它。在你的情况下,我认为这就是你想要的:

SELECT id, x, y, (@rn := @rn + 1) as rank
FROM table_name cross join
     (select @rn := 0) const
ORDER BY x DESC, y DESC;

编辑:

如果您只想获得给定值的结果,可以使用聚合查询计算行数:

select count(*)
from table_name t cross join
     (select t.*
      from table_name
      where id = $id
     ) id
where t.x > id.x or (t.x = id.x and t.y >= id.y)

编辑II:

要使用第一个查询获取单个ID,请将其放在子查询中:

select *
from (SELECT id, x, y, (@rn := @rn + 1) as rank
      FROM table_name cross join
           (select @rn := 0) const
      ORDER BY x DESC, y DESC
     ) t
where id = $id;

答案 1 :(得分:0)

一个简单的计数应该可以解决问题:

SELECT count(1)+1 FROM table_name WHERE x < ? or (x = ? and y > ?)

如果问号应填入id = $ id的行的列x的值。 +1是因为它计算记录上方的行数,这意味着rank = count + 1。