SQL查询返回相对顺序的int列

时间:2009-02-08 13:23:46

标签: sql mysql

假设我有两列的表:名称,年龄。

我想设计一个查询,它将返回按年龄排序的名称和年龄,但还要有一个额外的列,从1到N(最后一行)。

对于包含以下行的表:

John, 28
Jim, 30
Mike, 28

将返回以下行

John, 28, 1
Mike, 28, 2
Jim, 30, 3

我该怎么做? (我正在使用MySQL,顺便说一句,如果它产生差异)。

3 个答案:

答案 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