【问题标题】:MySQL: Increment column by fieldMySQL:按字段递增列
【发布时间】:2020-04-02 11:34:45
【问题描述】:

我正在尝试创建某种水果的列表。我想创建一个临时列 increment_value 来计算按类型插入的水果数量。

我有这张水果桌子:

+----------+------------+
| fruit_id | fruit_name | 
+----------+------------+
| 5        | Apple      | 
| 8        | Banana     | 
| 8        | Banana     | 
| 5        | Apple      | 
| 5        | Apple      | 
+----------+------------+

期望的结果:

+----------+------------+-----------------+
| fruit_id | fruit_name | increment_value |
+----------+------------+-----------------+
| 5        | Apple      | 1               |
| 8        | Banana     | 1               |
| 8        | Banana     | 2               |
| 5        | Apple      | 2               |
| 5        | Apple      | 3               |
+----------+------------+-----------------+

我尝试使用虚拟表但失败:DEMO

如何获得我想要的桌子?

【问题讨论】:

  • 哪个 MySQL 版本?
  • 为什么要存储几个相等的行?请考虑使用计数列。
  • @jarlh 无关版本。如果 5.7 更好
  • @AlbertoMoro 相反,版本非常重要。只有 MySQL 8.0 提供了具有Window functions 的真正解决方案,例如 ROW_NUMBER、RANK 或 DENSE_RANK。在所有以前的版本中,您必须使用 hack,例如增加变量
  • 所以,这就是你想要做的。那边是你尝试过的。伟大的。但问题是什么?

标签: mysql sql increment


【解决方案1】:

你可以使用row_number():

select f.*,
       row_number() over (partition by fruit_name order by fruit_name) as seqnum
from fruits f;

注意:SQL 表和结果集代表无序 集,因此排序是不确定的。您可以通过更改order by 子句来调整顺序。

【讨论】:

  • ...这显然只有在有东西要订购时才有意义
  • 谢谢,有了这个答案,我能够开发出我需要的查询。如果你需要它,我把 MySQL 5.7 的解决方案放在下面
【解决方案2】:

您可以简单地按如下查询进行分组:

SELECT fruit_id, fruit_name, SUM(fruit_id) as increment_value
FROM fruits
GROUP BY fruit_id;

【讨论】:

  • 感谢您的帮助,但此查询不是我想要的
【解决方案3】:

感谢@Gordon 的回复。我从this post 获得灵感。 我是为 MySQL 5.7 编写的。

SELECT  
    fruits.*,
    @row_num :=IF(@prev_value= fruit_id, @row_num+1 , 1)AS RowNumber,
    @prev_value := fruit_id
FROM fruits
CROSS JOIN (SELECT @row_num :=1,  @prev_value :=0) vars
ORDER BY fruit_id

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多