MySQL:在SELECT语句中自动递增临时列

53

如何在使用MySQL的SELECT语句中创建一个自动增加的临时列?

这是我目前的进展:

SET @cnt = 0;
SELECT
    (@cnt =@cnt + 1) AS rowNumber,
    rowID
FROM myTable
WHERE CategoryID = 1

返回:

+++++++++++++++++++++
+ rowNumber | rowID +
+++++++++++++++++++++
+  (NULL)   |   1   +
+  (NULL)   |   25  +
+  (NULL)   |   33  +
+  (NULL)   |   150 +
+  (NULL)   |   219 +
+++++++++++++++++++++

但我需要:

+++++++++++++++++++++
+ rowNumber | rowID +
+++++++++++++++++++++
+  1        |   1   +
+  2        |   25  +
+  3        |   33  +
+  4        |   150 +
+  ...      |   ... +
+++++++++++++++++++++

1, 2, 2, 4。请解释数字3去哪了。 - Kermit
2
@FreshPrinceOfSO 在介词之后的某个位置 - swasheck
抱歉,打错了!那应该是一个3。 - Sg1456
4
应该是@cnt := @cnt + 1,注意冒号(:)的存在。 - Marc B
4个回答

108
这将为您提供一个带有3的连续行号。
SELECT
    (@cnt := @cnt + 1) AS rowNumber,
    t.rowID
FROM myTable AS t
  CROSS JOIN (SELECT @cnt := 0) AS dummy
WHERE t.CategoryID = 1
ORDER BY t.rowID ;

结果

| 行号 | 行ID |
---------------------
|    1 |     1 |
|    2 |    25 |
|    3 |    33 |
|    4 |   150 |
注:该表格展示了行号和行ID之间的对应关系。

抱歉,请问 b 是什么意思?我在那一行仍然收到一个错误。 - Sg1456
CROSS JOIN 是真正的天才之举。谢谢您的分享。 - Samuel Ramzan

35

但是,如果在选择语句中有group by怎么办?计数将会出错。

对于这种情况,我发现唯一的解决方案是嵌套选择:

SELECT (@cnt := @cnt + 1) AS rowNumber, t.*
from
(select
    t.rowID
FROM myTable 
WHERE CategoryID = 1
ORDER BY rowID) t
CROSS JOIN (SELECT @cnt := 0) AS dummy

5
你太厉害了!我在 Stack Overflow 上搜了整个网站都没有找到解决方案,直到我看到了你的答案! - talha2k
谢谢分享,这正是我正在寻找的。 - w5m
这应该是正确的答案,如果使用ORDER BY更改结果顺序,则当前的正确答案将无法工作。 - pmiguelpinto

30

1

你可以使用这段代码。我认为这是一个更简单的解决方案。

select ROW_NUMBER() OVER (  ORDER BY id  ) AS Seid, id from table1 where id<10

结果:

| Seid | id |

| 1 | 5|

| 2 | 7|

| 3 | 8|

| 4 | 9|


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接