[英]Select/generate counter value in ordered by select in MySQL
我知道 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 |
+------------+------+--------------+---------+
任何帮助将非常感激。
考虑以下:
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+ 中,您有更多选择
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.