【问题标题】:Select/generate counter value in ordered by select in MySQL在 MySQL 中按 select 排序选择/生成计数器值
【发布时间】:2020-06-12 12:05:39
【问题描述】:

我知道 MySQL 中没有序列生成器。即使我想知道是否有办法实现这一点:
我有以下选择,我需要在哪里生成一个带计数器的字段

mysql> select name, age, hobby, ' ' counter from t order by name;
+------------+------+--------------+---------+
| name       | age  | hobby        | counter |
+------------+------+--------------+---------+
| Mark       |   21 | Soccer       |         |
| Mark       |   21 | Football     |         |
| pizzipizzi |    7 | cronchcronch |         |
| Steve      |   23 | Basketball   |         |
| Steve      |   23 | Coding       |         |
| Steve      |   23 | Soccer       |         |
+------------+------+--------------+---------+
5 rows in set (0.01 sec)

所需的结果集(每个新名称的计数器重置为 0):

+------------+------+--------------+---------+
| name       | age  | hobby        | counter |
+------------+------+--------------+---------+
| Mark       |   21 | Soccer       |    0    |
| Mark       |   21 | Football     |    1    |
| pizzipizzi |    7 | cronchcronch |    0    |
| Steve      |   23 | Basketball   |    0    |
| Steve      |   23 | Coding       |    1    |
| Steve      |   23 | Soccer       |    2    |
+------------+------+--------------+---------+

任何帮助将不胜感激。

【问题讨论】:

  • @Strawberry 同一个name 中的顺序无关紧要。我只需要计数器从具有相同name 的每个行子集中的 0 重新开始。
  • 这个计数器应该解决什么问题?
  • 你的mysql版本是多少?
  • @Repox 我需要生成像0.jpg,1.jpg,.. 这样的文件名。 name 在我的真实场景中(上面只是一个例子)是目录名。我知道我可以以编程方式执行此操作,但我认为直接从查询中获取这些值更方便。
  • @Strawberry 更正了示例,结果中的第三行之前是手动添加的。

标签: mysql generator counter


【解决方案1】:

考虑以下几点:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,name VARCHAR(20) NOT NULL
,age INT NOT NULL
,hobby VARCHAR(20) NOT NULL
);

INSERT INTO my_table (name,age,hobby) VALUES
('Mark',21,'Soccer'),
('Mark',21,'Football'),
('pizzipizzi',7,'cronchcronch'),
('Steve',23,'Basketball'),
('Steve',23,'Coding'),
('Steve',23,'Soccer');

SELECT x.*
     , COUNT(y.id)-1 counter 
  FROM my_table x 
  JOIN my_table y 
    ON y.name = x.name 
   AND y.age = x.age 
   AND y.id <= x.id 
 GROUP  
    BY x.id;
+----+------------+-----+--------------+---------+
| id | name       | age | hobby        | counter |
+----+------------+-----+--------------+---------+
|  1 | Mark       |  21 | Soccer       |       0 |
|  2 | Mark       |  21 | Football     |       1 |
|  3 | pizzipizzi |   7 | cronchcronch |       0 |
|  4 | Steve      |  23 | Basketball   |       0 |
|  5 | Steve      |  23 | Coding       |       1 |
|  6 | Steve      |  23 | Soccer       |       2 |
+----+------------+-----+--------------+---------+

请注意,在 MySQL 8.0+ 中您有更多选择

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 2011-11-14
    • 2017-01-06
    • 2011-09-24
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多