【问题标题】:MySQL SELECT increment counterMySQL SELECT 增量计数器
【发布时间】:2012-11-14 00:55:52
【问题描述】:

这是我的 MySQL 查询:

SELECT name FROM table;

如何在name 旁边选择一个增量计数器?预期输出:

Jay 1
roy 2
ravi 3
ram 4

【问题讨论】:

    标签: mysql database select counter


    【解决方案1】:

    如果您的查询包含GROUP BY 语句,则使用交叉连接和逗号的解决方案将不起作用。对于这种情况,您可以使用子选择:

    SELECT (@row_number := @row_number + 1) AS rowNumber, res.*
    FROM
    (
      SELECT SUM(r.amount) 
      FROM Results r 
      WHERE username = 1 
      GROUP BY r.amount
    ) res
    CROSS JOIN (SELECT @row_number := 0) AS dummy
    

    【讨论】:

      【解决方案2】:
      SELECT name,
            @rownum := @rownum + 1 as row_number
      FROM your_table
         ,
         (select @rownum := 0) r
      

      我更喜欢使用逗号而不是CROSS JOIN,因为它执行得更快。使用CROSS JOIN 将增加一个向表中添加列的额外步骤。

      【讨论】:

      • 非常有趣。你能解释一下这个语法吗?这解决了我在结果不一致的分组项目上遇到的问题。在同一会话的控制台中,第一次运行返回所有 1,然后从第二次运行开始正常。所以它从来没有作为一个脚本工作。直到我删除了初始 set @var 命令并使用了您的方法。现在它一直有效!
      【解决方案3】:

      在 MySQL 8 及更高版本中,您还可以使用ROW_NUMBER() Window function

      SELECT
          name,
          ROW_NUMBER() OVER ()
      FROM table
      

      结果:

      Jay  1
      roy  2
      ravi 3
      ram  4
      

      如 juergen d 所示,最好使用ORDER BY 进行确定性查询。

      ORDER BY 可以独立应用于查询和计数器。所以:

      SELECT
          name,
          ROW_NUMBER() OVER (ORDER BY name DESC)
      FROM table
      ORDER BY name
      

      会给你一个按降序排列的计数器。

      结果:

      Jay  4
      ram  3
      ravi 2
      roy  1
      

      【讨论】:

        【解决方案4】:
        select name,
              @rownum := @rownum + 1 as row_number
        from your_table
        cross join (select @rownum := 0) r
        order by name
        

        这部分:

        cross join (select @rownum := 0) r
        

        可以在不需要单独查询的情况下引入变量。所以第一个查询也可以像这样分解成两个查询:

        set @rownum := 0;
        
        select name,
              @rownum := @rownum + 1 as row_number
        from your_table
        order by name;
        

        例如在存储过程中使用时。

        【讨论】:

        • 正如Fabio Reche 所说,我们需要在rownum + 1 前面加上一个'@'...不是应该是@rownum := @rownum + 1 吗?
        • 谢谢,CROSS JOIN +1,当我需要按 clausule (map/reduce) 分组时解决了另一个问题
        • 子请求用于初始化@rownum。
        • 如果您对值进行排序,此解决方案将无法正常工作。未排序行的计数器增量。
        • @Paktas:我不知道你在说什么。你能详细说明一下吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多