CREATE TABLE `sequence` (`id` int(11) NOT NULL auto_increment, `load_status` varchar(100) default NULL, PRIMARY KEY (`id`));
INSERT INTO `sequence` VALUES (1,'success'),(2,'success'),(3,'success'),(4,'fail'),(5,'success');
mysql>select * from sequence;
+----+-------------+
| id | load_status |
+----+-------------+
| 1 | success |
| 2 | success |
| 3 | success |
| 4 | fail |
| 5 | success |
+----+-------------+
5 rows in set (0.00 sec)
我想要顺序显示“成功”的所有状态。 ID 的 1,2 和 3 将被返回。但是 ID 5 不会被选中,除非它后面有另一个成功。
最佳答案
如果您要处理大量数据,这种方法可能不可行(我对大型数据库没有经验),但也许这会有所帮助。
想法是创建子查询来获取相邻的行:
mysql> select id, load_status, (select load_status from test as t2 where t2.id < t1.id order by t2.id desc limit 1) as prev_load_status, (select load_status from test as t3 where t3.id > t1.id order by t3.id asc limit 1) as next_load_status from test as t1;
+----+-------------+------------------+------------------+
| id | load_status | prev_load_status | next_load_status |
+----+-------------+------------------+------------------+
| 1 | success | NULL | success |
| 2 | success | success | success |
| 3 | success | success | fail |
| 4 | fail | success | success |
| 5 | success | fail | NULL |
+----+-------------+------------------+------------------+
5 rows in set (0.00 sec)
我最初在其中添加了一个 HAVING
子句以将结果限制在集群中:
mysql> select id, load_status, (select load_status from test as t2 where t2.id < t1.id order by t2.id desc limit 1) as prev_load_status, (select load_status from test as t3 where t3.id > t1.id order by t3.id asc limit 1) as next_load_status from test as t1 having load_status = prev_load_status or load_status = next_load_status;
+----+-------------+------------------+------------------+
| id | load_status | prev_load_status | next_load_status |
+----+-------------+------------------+------------------+
| 1 | success | NULL | success |
| 2 | success | success | success |
| 3 | success | success | fail |
+----+-------------+------------------+------------------+
3 rows in set (0.00 sec)
但事实证明您可以将子查询放在 WHERE
子句中:
mysql> select id, load_status from test as t1 where load_status = (select load_status from test as t2 where t2.id < t1.id order by t2.id desc limit 1) or load_status = (select load_status from test as t3 where t3.id > t1.id order by t3.id asc limit 1);
+----+-------------+
| id | load_status |
+----+-------------+
| 1 | success |
| 2 | success |
| 3 | success |
+----+-------------+
3 rows in set (0.00 sec)
关于mysql - 选择顺序记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5001584/