假设我有两列的表:名称,年龄。
我想设计一个查询,它将返回按年龄排序的名称和年龄,但还要有一个额外的列,从1到N(最后一行)。
对于包含以下行的表:
John, 28
Jim, 30
Mike, 28
将返回以下行
John, 28, 1
Mike, 28, 2
Jim, 30, 3
我该怎么做? (我正在使用MySQL,顺便说一句,如果它产生差异)。
答案 0 :(得分:4)
不了解MySQL,但在SQL Server中你这样做:
SELECT Name, Age, ROW_NUMBER() OVER (ORDER BY AGE) AS RunningCount
FROM MyTable
快速谷歌搜索“mysql和ROW_NUMBER()”我发现了这个:
set @num = 0;
select *, @num := @num + 1 as row_number from TABLE
所以大概你可以使用那种语法
答案 1 :(得分:1)
在mysql中你可以:
SELECT Row,Name,Age
FROM (SELECT @row := @row + 1 AS Row, Name,Age FROM table1 )
As derived1
但是,下一种方法是通用的(但是你需要在表的一列中有唯一的值,在这个例子中我使用了名称,但它可以是任何唯一的列)
select rank=count(*), a1.name, a1.age
from table1 a1, table1 a2
where a1.name >= a2.name
group by a1.name , a1.age
order by rank
答案 2 :(得分:0)
如果您正在寻找适用于任何SQL平台的通用方法,则以下内容应该有效。我从未在非常大的桌子上使用它,所以我不知道性能如何。此外,如果您的姓名和年龄在两行之间可能相同,那么您将获得重复的数字(例如,1,2,3,3,5 ......)。如果你想通过在那里添加PK或保证唯一的其他一组列,你可以避免这种情况。
SELECT
T1.name,
T1.age,
COUNT(T2.name) + 1
FROM
My_Table T1
LEFT OUTER JOIN My_Table T2 ON
T2.age < T1.age OR
(
T2.age = T1.age AND
T2.name < T1.name
)
GROUP BY
T1.name,
T2.age
ORDER BY
T1.age,
T2.name