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

标签 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 然后按 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/

相关文章:

mysql - 从表 B 中删除表 A 中不存在的值

php - 你能提示 PHP 5.2.5 中的返回类型吗?

php - .htaccess 在 ubuntu 服务器上无法正常工作

mysql - 无法连接到 mysql 数据库 ubuntu 20.4 (VPS) "ModuleNotFoundError: No module named ' MySQLdb'"

php - 使用错误的表别名生成查询的原则

mysql:如何根据字段结果有不同的顺序

android - SQLite Random() 在 ORDER BY 中排序不正确

php - 如何使用 cURL 抓取 iframe 内容

php - 使用 PHP 替换文件夹中的现有文件之前确认

mysql - MySQL如何将多条记录中的有序数据返回到一条记录中?