如果我做类似的事情
SELECT * FROM mytable ORDER BY mycolumn ASC;
我按特定顺序得到一个结果表。
在给定 PK 的情况下,SQL 中有没有一种方法可以有效地找出结果表中的哪个位置将包含我的 PK 记录?
如果我做类似的事情
SELECT * FROM mytable ORDER BY mycolumn ASC;
我按特定顺序得到一个结果表。
在给定 PK 的情况下,SQL 中有没有一种方法可以有效地找出结果表中的哪个位置将包含我的 PK 记录?
您可以计算要排序的值的值低于您知道以下键值的记录的记录数:
select count(*)
from mytable
where mycolumn < (select mycolumn from mytable where key = 42)
在支持它的数据库上,您可以为此目的使用 ROW_NUMBER():
SELECT RowNr
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr,
mycolumn
FROM mytable
) sub
WHERE sub.mycolumn = 42
该示例假设您正在寻找主键 42 :)
子查询是必要的,因为类似:
SELECT
ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr
FROM mytable
WHERE sub.mycolumn = 42
将始终返回 1;ROW_NUMBER() 在 WHERE 之后起作用,可以这么说。
SQL 不能那样工作。它是基于集合的,这意味着“该结果表中的位置”对数据库没有意义。
当您将 ResultSet 映射到对象集合或迭代它时,您可以跟踪位置。
不幸的是,您无法获得“表格中一行的位置”。
使用 ORDER BY 和 ROW_NUMBER 构造的变体(取决于使用的数据库引擎),您可以获得的最佳结果是执行查询的结果集中的行位置。
但是,该位置不会映射回表中的任何位置,除非 ORDER BY 位于一组聚集索引列上,但即便如此,该位置也可能在下一秒失效。
我想知道的是你打算用这个“职位”做什么。
==> 低于 8.0
SET @row_number = 0;
SELECT
(@row_number:=@row_number + 1) AS num,
myColumn.first,
myColumn.second
FROM
myTable
ORDER BY myColumn.first, myColumn.second
来源:http ://www.mysqltutorial.org/mysql-row_number/
==> 大于 8.0
请参阅MySQL ROW_NUMBER() 函数手册,因为我没有测试。但似乎这个功能是首选。
如果不选择整个记录子集,您将无法判断这一点。如果你的 PK 是整数类型,你可以
select count(*) from mytable
where id <= 10 -- Record with ID 10
order by mycolumn asc