2012-10-03 48 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