需要MySQL查询中每一行的序列号

Ted*_*Ted 2 mysql sql-order-by

所以我觉得这很有用:

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

这项@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
Run Code Online (Sandbox Code Playgroud)

注意: 我注意到if I remove the JOINs I DO get the requested result(ROW无论ID的ORDER BY是哪一行,每行的序号).第一个例子效果很好但是对于某些原因,JOIN会以某种方式弄乱它.

所以我明白了:

ROW  | ID  
3      15  
2      10  
1      2
Run Code Online (Sandbox Code Playgroud)

我所追求的是:

ROW  | ID  
1      15  
2      10  
3      2
Run Code Online (Sandbox Code Playgroud)

这是SqlFiddle

因此,基本上似乎在ORDER BY发生之前评估行号.我需要在ORDER BY给出一行之后进行.

我怎样才能做到这一点?

Tar*_*ryn 8

删除ORDER BY:

SELECT (@row:=@row+1) AS ROW, ID  
FROM table1 ,(SELECT @row := 0) r   
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

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

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

或者如果您保留ORDER BY查询,那么您可以通过简单地使用任何一个DESCASC订单来查看行号的应用方式- 请参阅演示

如果您使用DESC订单

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

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

ROW | ID
----------
1   | 15
2   | 10
3   | 2
Run Code Online (Sandbox Code Playgroud)

如果您使用ASC订单:

SELECT (@row:=@row+1) AS ROW, ID  
FROM table1 ,(SELECT @row := 0) r   
ORDER BY ID;
Run Code Online (Sandbox Code Playgroud)

结果是:

ROW | ID
----------
1   | 2
2   | 10
3   | 15
Run Code Online (Sandbox Code Playgroud)

编辑,根据您的更改,您应该将行号放在子查询中,然后加入其他表:

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;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo