一尘不染

用于结果集中的行自动编号的Pure-SQL技术

sql

我正在寻找一种对 结果集中的 行(而不是表)进行顺序编号的方法。本质上,我从如下查询开始:

SELECT id, name FROM people WHERE name = 'Spiewak'

ids为显然不是一个真正的序列(如1, 2, 3, 4)。我需要的是结果集中的另一列,其中包含这些自动编号。如果愿意的话,我愿意使用SQL函数,但是我宁愿不使用ANSI规范的扩展名。

平台是MySQL,但该技术应尽可能跨平台(因此有避免非标准扩展的愿望)。


阅读 163

收藏
2021-03-17

共1个答案

一尘不染

要获得有意义的行号,您需要对结果进行排序。然后,您可以执行以下操作:

SELECT id, name
    , (SELECT COUNT(*) FROM people p2 WHERE name='Spiewak' AND p2.id <= p1.id) AS RowNumber
FROM people p1
WHERE name = 'Spiewak'
ORDER BY id

注意的子查询需求WHERE子句WHERE子句或从主查询主键相匹配 ,并 在ORDER BY主查询。

SQL Server具有ROW_NUMBER()OVER构造来简化此操作,但是我不知道MySQL是否有任何特殊的解决方法。


由于我的帖子在这里被接受为答案,因此我也想讲出Dan Goldstein的回答,这种回答与方法非常相似,但是使用JOIN而不是子查询,并且通常会表现得更好

2021-03-17