2010-05-09 3 views
4

У меня есть таблица выглядит следующим образом:В поисках «свободный» раза в MySQL

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 утра, 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 11:00:00 | 
| 2010-04-26 10:00:00 | 2010-04-26 12:00:00 | 
| 2010-04-26 10:00:00 | 2010-04-26 13:00:00 | 
| 2010-04-26 13:15:00 | 2010-04-26 16:15:00 | 
| 2010-04-26 14:15:00 | 2010-04-26 16:15:00 | 
| 2010-04-26 15:15:00 | 2010-04-26 17:15:00 | 
| 2010-04-26 16:15:00 | 2010-04-26 18:15:00 | 
...etc... 

Выход Я ищу из этого будет:

+---------------------+---------------------+ 
| 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 | 

Любая помощь приветствуется , благодаря!

+0

дубликат http://stackoverflow.com/questions/964288/flattening-intersecting-timespans. см. также http://explainextended.com/2009/06/13/flattening-timespans-mysql/. –

ответ

1

Нечто подобное должно работать.

ВЫБОР l2.start, l.end ОТ student_lectures л LEFT JOIN student_lectures l2 ПО l2.end МЕЖДУ l.start И l.end ГДЕ l.start МЕЖДУ «2010-04-26 00:00 : 00' И '2010-04-26 23:59:59' GROUP BY l.start ORDER BY l.start

+0

Работает - но занимает 1.8s для выполнения на моем наборе результатов, в отличие от ссылки, связанной выше http://stackoverflow.com/questions/964288/flattening-intersecting-timespans –