【问题标题】:Need a sequence number for every row in MySQL queryMySQL查询中的每一行都需要一个序列号
【发布时间】:2012-10-03 11:36:13
【问题描述】:

所以我发现这个很有用:

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 在行后发生。

我怎样才能做到这一点?

【问题讨论】:

    标签: mysql sql-order-by


    【解决方案1】:

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

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


    SQL Fiddle demo

    【讨论】:

      【解决方案2】:

      删除ORDER BY

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

      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
      

      或者,如果您在查询中留下ORDER BY,那么您可以通过简单地使用DESCASC order - See Demo 来查看应用行号的方式。

      如果您使用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 with Demo

      【讨论】:

      • 抱歉,我不得不取消标记您的答案,因为管理员不允许我再提问。问题是,当涉及到 JOIN 时,它会以某种方式混淆结果。所以 ID=2 总是得到 ROW=1 并且 ID=15 得到 ROW=3。在 :edit: 中解释
      • @ted 很好,这是与您提出的原始问题不同的问题。请用一些示例数据创建一个 sql fiddle
      • 我很抱歉那个 bluefeet,这是版主的决定
      • @Ted 看到我的编辑,你会想要使用子查询来分配行号,然后加入它。
      • @Ted 你能解释一下“版主的决定”吗?您是否收到“我们不再接受来自此帐户的问题”的消息?如果是这样,please read this in full.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2014-12-24
      • 1970-01-01
      • 2011-07-06
      相关资源
      最近更新 更多