2009-02-08 27 views
0

說我有兩列的表:名稱,年齡。SQL查詢返回int列的相對順序

我想設計一個查詢,將返回按年齡排序的名稱和年齡,但也有一個額外的列將從1到N(最後一行)運行。

因此,對於具有以下行的表:

John, 28 
Jim, 30 
Mike, 28 

以下行將返回

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

我怎樣才能做到這一點? (我使用MySQL,順便說一句,如果它使差異)。

回答

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

那麼想必你可以使用,而不是語法

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