如果我做的话
SELECT * FROM mytable ORDER BY mycolumn ASC;
我按特定顺序获得结果表。
在SQL中有没有办法有效地找出,给定PK,结果表中的哪个位置会包含我的PK记录?
答案 0 :(得分:20)
您可以计算您正在排序的值的值低于您知道键值的记录的值:
select count(*)
from mytable
where mycolumn < (select mycolumn from mytable where key = 42)
答案 1 :(得分:18)
在支持它的数据库上,您可以使用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之后工作。
答案 2 :(得分:2)
SQL无法正常工作。它是基于集合的,这意味着“结果表中的位置”对数据库毫无意义。
将ResultSet映射到对象集合或迭代它时,可以跟踪位置。
答案 3 :(得分:0)
不幸的是,你无法获得“表中行的位置”。
使用ORDER BY和ROW_NUMBER构造的变体(取决于正在使用的数据库引擎),您可以获得的最佳结果是在执行的查询的结果集中行的位置。
此位置不会映射回表中的任何位置,除非ORDER BY位于一组聚簇索引列上,但即使这样,该位置也可能在下一秒失效。
我想知道的是你打算使用这个“职位”。
答案 4 :(得分:0)
==>低于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() function manual,因为我没有测试。但似乎首选此功能。
答案 5 :(得分:-1)
如果不选择整个记录子集,就无法确定。如果你的PK是整数类型,你可以
select count(*) from mytable
where id <= 10 -- Record with ID 10
order by mycolumn asc