在MySQL中查找“空闲”时间

在MySQL中查找“空闲”时间,mysql,date,timespan,Mysql,Date,Timespan,我有一张桌子如下: mysql> DESCRIBE student_lectures; +------------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+----------+------+-----+---------+-----

我有一张桌子如下:

mysql> DESCRIBE student_lectures;
+------------------+----------+------+-----+---------+----------------+
| Field            | Type     | Null | Key | Default | Extra          |
+------------------+----------+------+-----+---------+----------------+
| id               | int(11)  | NO   | PRI | NULL    | auto_increment |
| course_module_id | int(11)  | YES  | MUL | NULL    |                |
| day              | int(11)  | YES  |     | NULL    |                |
| start            | datetime | YES  |     | NULL    |                |
| end              | datetime | YES  |     | NULL    |                |
| cancelled_at     | datetime | YES  |     | NULL    |                |
| lecture_type_id  | int(11)  | YES  |     | NULL    |                |
| lecture_id       | int(11)  | YES  |     | NULL    |                |
| student_id       | int(11)  | YES  |     | NULL    |                |
| created_at       | datetime | YES  |     | NULL    |                |
| updated_at       | datetime | YES  |     | NULL    |                |
+------------------+----------+------+-----+---------+----------------+
我基本上是想找出一个讲座没有发生的时间,所以为了做到这一点,我在考虑一个查询,将重叠的讲座分组在一起,例如,上午9点到10点和上午10点到11点的讲座将显示为上午9点到11点的单个讲座。可能会有两次以上的背靠背讲座

我现在有这个:

SELECT l.start, l2.end
FROM student_lectures l
LEFT JOIN student_lectures l2 ON ( l2.start = l.end )
WHERE l.student_id = 1 AND l.start >= '2010-04-26 09:00:00' AND l.end <= '2010-04-30 19:00:00' AND l2.end IS NOT NULL AND l2.end != l.start
GROUP BY l.start, l2.end
ORDER BY l.start, l2.start
我希望从中得到的结果是:

+---------------------+---------------------+
| start               | end                 |
+---------------------+---------------------+
| 2010-04-26 09:00:00 | 2010-04-26 13:00:00 |
| 2010-04-26 13:15:00 | 2010-04-26 18:15:00 |

感谢您的帮助,谢谢

像这样的事情应该行得通

选择l2.start,l.end 来自学生讲座 左键加入学生_在l2上讲授l2。结束 在l.起点和l.终点之间 我从哪里开始 在“2010-04-26 00:00:00”和“2010-04-26 23:59:59”之间 从左开始分组
ORDER BY l.start

ax想出了迄今为止我所见过的最好的答案,那就是,

重复的。另请参见.Does工作-但在我的resultset上执行需要1.8秒,而不是上面链接的
+---------------------+---------------------+
| start               | end                 |
+---------------------+---------------------+
| 2010-04-26 09:00:00 | 2010-04-26 13:00:00 |
| 2010-04-26 13:15:00 | 2010-04-26 18:15:00 |