3

所以我发现这个很有用:

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

@row:=@row+1效果很好,但我得到了按 ID 排序的行。

我的表看起来更像这样:

SELECT (@row:=@row+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是每行的序号,无论 ID 的 ORDER BY 是什么)。第一个示例效果很好,但对于某些原因,JOIN 以某种方式将其搞砸了。

所以我明白了:

ROW  | ID  
3      15  
2      10  
1      2

我追求的是:

ROW  | ID  
1      15  
2      10  
3      2

这是SqlFiddle

所以基本上似乎在ORDER BY发生之前评估了行号。我需要在ORDER BY给出行后进行。

我怎样才能做到这一点?

4

2 回答 2

9

删除ORDER BY

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

请参阅带有演示的 SQL Fiddle

然后,如果您想ORDER BY在另一个中使用包装查询SELECT

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

或者,如果您离开查询,那么您可以通过简单地使用or 或order来查看ORDER BY行号的应用方式-参见演示DESCASC

如果您使用DESC订单

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

结果似乎是您想要的结果:

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

如果您使用ASC订单:

SELECT (@row:=@row+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:=@row+1) AS ROW, ID  
  FROM Table1,(SELECT @row := 0) r   
  order by ID desc
) x
JOIN Table2 
  on x.ID = Table2.ID;

请参阅带有演示的 SQL Fiddle

于 2012-10-03T11:38:44.820 回答
4

我没有发现您的查询有任何问题

SELECT (@row:=@row+1) AS ROW, ID  
FROM table1 ,(SELECT @row := 0) r   
order by ID desc


SQL Fiddle 演示

于 2012-10-03T11:42:16.617 回答