现在这已经好几个小时了。看起来很简单,但我找不到答案。
基本上我有以下示例数据的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,因为它排序第二。
我需要将此值作为变量返回。感谢
答案 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。