我有一个具有以下结构的表
finals(ID, name, result)
CREATE TABLE `finals` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`result` char(4) DEFAULT NULL,
PRIMARY KEY (`id`)
);
在哪里:
ID
是一个自动增量键,name
是这个人的名字,result
是通过还是失败
样本数据
mysql> select * from finals;
+----+------+--------+
| id | name | result |
+----+------+--------+
| 1 | John | Pass |
| 2 | John | Fail |
| 3 | John | Pass |
| 4 | Kyle | Pass |
| 5 | John | Pass |
| 6 | Kyle | Pass |
| 7 | Kyle | Pass |
| 8 | Kyle | Fail |
+----+------+--------+
8 rows in set (0.00 sec)
解释
我正在尝试获取至少连续 3 次“通过”的人的姓名。所以,想要的结果是: “Kyle” 因为“Kyle”有 3 个连续的“Pass”,ID为 4、6、7 。
请注意,我不关心这个序列是否被其他人的记录打断,但我关心它是否被同一个人的记录打断,结果中的值为“失败”。
这就是为什么“约翰” 不在预期结果中的原因。即虽然“约翰”总共有 3 个“通过”,但它们被“失败”打断,所以我想从结果中排除它。
我试过这个查询:
mysql> SELECT name, GROUP_CONCAT(result ORDER BY id) as result_str FROM finals GROUP BY name having result_str LIKE '%Pass,Pass,Pass%';
+------+---------------------+
| name | result_str |
+------+---------------------+
| Kyle | Pass,Pass,Pass,Fail |
+------+---------------------+
1 row in set (0.00 sec)
它有效,这是预期的结果。但是,我正在寻找替代方法
- 更通用
- 避免对 GROUP_CONCAT 结果长度的限制。
先感谢您。