2012-10-03 98 views
2

所以我發現了這個偉大的使用:需要一個序列號在MySQL查詢中的每一行

SELECT (@row:[email protected]+1) AS ROW, ID 
FROM TableA ,(SELECT @row := 0) r 
ORDER BY ID DESC 

@row:[email protected]+1的偉大工程,但我得到由ID命令行。

我的表看起來更像是這樣的:

SELECT (@row:[email protected]+1) AS ROW, ID , ColA, ColB, ColC 
FROM TableA 
JOIN TableB on TableB.ID = TableA.ID 
JOIN TableC on TableC.ID = TableA.ID 
WHERE ID<500 
,(SELECT @row := 0) r 
ORDER BY ID DESC 

注: 我注意到if I remove the JOINs I DO get the requested result(其中ROW是連號的每一行的,無論ORDER BY ID的)。第一個例子很好,但是對於某些情況,JOIN會以某種方式搞砸它。

,所以我得到這樣的:

ROW | ID 
3  15 
2  10 
1  2 

我是後是:

ROW | ID 
1  15 
2  10 
3  2 

這裏的SqlFiddle

所以基本上看來,行號前的評估ORDER BY發生。排行後我需要ORDER BY

我該如何做到這一點?

回答

7

刪除ORDER BY

SELECT (@row:[email protected]+1) AS ROW, ID 
FROM table1 ,(SELECT @row := 0) r 

SQL Fiddle with Demo

然後,如果你想使用ORDER BY包裹查詢在其他SELECT

select * 
from 
(
    SELECT (@row:[email protected]+1) AS ROW, ID 
    FROM table1 ,(SELECT @row := 0) r 
) x 
order by row 

或者,如果你留在ORDER BY查詢,那麼你可以通過簡單地使用ei來查看行號的應用方式療法DESCASC順序 - See Demo

如果使用DESC爲了

SELECT (@row:[email protected]+1) AS ROW, ID 
FROM table1, (SELECT @row := 0) r 
order by id desc; 

結果這似乎是你想要的結果:如果你使用ASC爲了

ROW | ID 
---------- 
1 | 15 
2 | 10 
3 | 2 

SELECT (@row:[email protected]+1) AS ROW, ID 
FROM table1 ,(SELECT @row := 0) r 
ORDER BY ID; 

的結果是:

ROW | ID 
---------- 
1 | 2 
2 | 10 
3 | 15 

編輯,根據你的變化,你應該把行號在一個子查詢,再加入其他表:

select * 
from 
(
    SELECT (@row:[email protected]+1) AS ROW, ID 
    FROM Table1,(SELECT @row := 0) r 
    order by ID desc 
) x 
JOIN Table2 
    on x.ID = Table2.ID; 

SQL Fiddle with Demo

+0

對不起,我不得不取消你的答案,因爲管理員不允許我問另一個問題。事情是,當JOIN參與時,它會以某種方式混淆結果。所以ID = 2總是得到ROW = 1和ID = 15得到ROW = 3。編輯:在解釋 – Ted

+0

@ted清楚,是從原來的一個你問一個單獨的問題。編輯:請創建一些樣本數據的SQL小提琴 – Taryn

+0

只是在做 – Ted