4

次のようなテーブルがあります。

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時までの講義)。2 つ以上の講義が連続して行われる場合があります。

私は現在これを持っています:

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 |

どんな助けでも感謝します、ありがとう!

4

2 に答える 2

1

このようなものがうまくいくはずです。

SELECT l2.start, l.end FROM student_lectures l LEFT JOIN student_lectures l2 ON l2.end BETWEEN l.start AND l.end WHERE l.start BETWEEN '2010-04-26 00:00:00' AND '2010-04- 26 23:59:59' GROUP BY l.start ORDER BY l.start

于 2010-05-14T17:09:42.457 に答える
0

axこれまでに見た中で最良の答えを思いついた-つまり、http://explainextended.com/2009/06/13/flattening-timespans-mysql/

于 2010-05-14T19:17:07.530 に答える