10

如果我做类似的事情

SELECT * FROM mytable ORDER BY mycolumn ASC;

我按特定顺序得到一个结果表。

在给定 PK 的情况下,SQL 中有没有一种方法可以有效地找出结果表中的哪个位置将包含我的 PK 记录?

4

6 回答 6

26

您可以计算要排序的值的值低于您知道以下键值的记录的记录数:

select count(*)
from mytable
where mycolumn < (select mycolumn from mytable where key = 42)
于 2009-05-25T17:17:58.153 回答
21

在支持它的数据库上,您可以为此目的使用 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 之后起作用,可以这么说。

于 2009-05-25T17:14:35.083 回答
2

SQL 不能那样工作。它是基于集合的,这意味着“该结果表中的位置”对数据库没有意义。

当您将 ResultSet 映射到对象集合或迭代它时,您可以跟踪位置。

于 2009-05-25T17:16:44.130 回答
0

不幸的是,您无法获得“表格中一行的位置”。

使用 ORDER BY 和 ROW_NUMBER 构造的变体(取决于使用的数据库引擎),您可以获得的最佳结果是执行查询的结果集中的行位置。

但是,该位置不会映射回表中的任何位置,除非 ORDER BY 位于一组聚集索引列上,但即便如此,该位置也可能在下一秒失效。

我想知道的是你打算用这个“职位”做什么。

于 2009-05-25T18:48:40.103 回答
0

这个答案适用于 MySQL

==> 低于 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() 函数手册,因为我没有测试。但似乎这个功能是首选。

于 2019-12-14T21:52:45.383 回答
-1

如果不选择整个记录子集,您将无法判断这一点。如果你的 PK 是整数类型,你可以

select count(*) from mytable 
    where id <= 10 -- Record with ID 10
    order by mycolumn asc
于 2009-05-25T17:15:27.767 回答