【问题标题】:MySQL: Auto increment temporary column in select statementMySQL:在选择语句中自动增加临时列
【发布时间】:2013-04-02 13:40:29
【问题描述】:

如何使用 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 消失在哪里
  • @FreshPrinceOfSO 在介词之后的某处
  • 对不起,错字!那应该是3。
  • 应该是@cnt := @cnt + 1。注意:

标签: mysql auto-increment temporary


【解决方案1】:

这将为您提供一个连续行号与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 ;

结果

|行号 | ROWID | --------------------- | 1 | 1 | | 2 | 25 | | 3 | 33 | | 4 | 150 |

【讨论】:

  • 抱歉,b 是干什么用的?我仍然在该行收到错误。
【解决方案2】:

但是,如果您在 select 语句中有 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

【讨论】:

  • 你是传奇!我在整个 SO 中搜索了这个特定案例,但在遇到这个答案之前没有找到解决方案!
  • 感谢分享这正是我想要的。
  • 这应该是正确答案,如果ORDER BY改变了结果顺序,当前正确答案将不起作用
【解决方案3】:

试试这个:

SET @rownr=0;
SELECT @rownr:=@rownr+1 AS rowNumber, rowID
  FROM myTable
  WHERE CategoryID = 1

在现代版本的 MySQL 中,您可以使用 MySQL Window:http://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-function/

例子:

SELECT  ROW_NUMBER() OVER (  ORDER BY productName  ) row_num, 
        productName, msrp 
FROM   products ORDER BY   productName;

【讨论】:

    【解决方案4】:

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

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

    结果:

    |赛德 |身份证 |

    | 1 | 5|

    | 2 | 7|

    | 3 | 8|

    | 4 | 9|

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2019-07-04
      • 1970-01-01
      • 2018-08-27
      • 2011-07-12
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多