mysql - 选择顺序记录

标签 mysql

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/

相关文章:

php - 在 PHP/MySQL 中运行周一和周日之间的查询

MySQL - LOAD DATA INFILE 和文件行号

php - PHP 中的 2 列 Mysql 日期范围搜索

php - 在 php/sql 中选择不同的列,然后选择相关的列

PHP mysql : inserting data from an array

mysql - 1242 - 当 WHERE 使用 2 列进行更新时,子查询返回多于 1 行

mysql - JPA 与 EclipseLink ManyToMany 关系不起作用

mysql - javascript mysql 客户端

mysql - 使用 where 子句查看 1 列值 3 次

java - 失败: alter table comment drop foreign key