【发布时间】:2009-02-08 13:23:45
【问题描述】:
假设我有一个包含两列的表格:姓名、年龄。
我想设计一个查询,该查询将返回按年龄排序的姓名和年龄,但还要有一个额外的列,该列将从 1 运行到 N(最后一行)。
所以对于具有以下行的表:
John, 28
Jim, 30
Mike, 28
将返回以下行
John, 28, 1
Mike, 28, 2
Jim, 30, 3
我该怎么做? (顺便说一句,我正在使用 MySQL,如果它有差异的话)。
【问题讨论】:
假设我有一个包含两列的表格:姓名、年龄。
我想设计一个查询,该查询将返回按年龄排序的姓名和年龄,但还要有一个额外的列,该列将从 1 运行到 N(最后一行)。
所以对于具有以下行的表:
John, 28
Jim, 30
Mike, 28
将返回以下行
John, 28, 1
Mike, 28, 2
Jim, 30, 3
我该怎么做? (顺便说一句,我正在使用 MySQL,如果它有差异的话)。
【问题讨论】:
不了解 MySQL,但在 SQL Server 中你是这样操作的:
SELECT Name, Age, ROW_NUMBER() OVER (ORDER BY AGE) AS RunningCount
FROM MyTable
在“mysql and ROW_NUMBER()”上快速谷歌搜索我发现了这个:
set @num = 0;
select *, @num := @num + 1 as row_number from TABLE
所以大概你可以改用那个语法
【讨论】:
在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
【讨论】:
如果您正在寻找一种适用于任何 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
【讨论】: