这几个小时以来一直困扰着我。这看起来很简单,但我就是找不到答案。
基本上我有一个包含以下示例数据的 MYSQL 表,请注意还有其他列但对于此问题不是必需的。
id | x | y 1 | 50 | 3 2 | 40 | 1 3 | 50 | 0 4 | 50 | 1 5 | 40 | 2
我想按 x DESC 然后按 y 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,因为它排在第二位。
我需要这个值作为变量返回。谢谢
最佳答案
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)
编辑二:
要使用第一个查询获取单个 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;
关于PHP MYSQL 使用 order by 子句从表中查找行号/排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21063619/