or not ('2009-12-06 00:00:00' between evtdt.event_from_datetime
and evtdt.event_to_datetime);
12/6/2009 равно в период с 12/5/09 по 12/7/09 ... поэтому исключение venue_id 1 ... из чего вы пытаетесь извлечь данные точно?
Запрос на объединение, который вы создали, говорит: возьмите таблицу мест и для каждой строки, для которой есть соответствующий venue_id, сделайте копию строки таблицы мест и добавьте соответствующую строку. Так что, если вы только что сделали:
select *
from venues ven
left join event_dates evtdt
on (ven.id=evtdt.venue_id);
Это даст:
+----+---------+------+----------+---------------------+---------------------+----------+
| id | name | id | event_id | event_from_datetime | event_to_datetime | venue_id |
+----+---------+------+----------+---------------------+---------------------+----------+
| 1 | venue 1 | 1 | 1 | 2009-12-05 00:00:00 | 2009-12-07 00:00:00 | 1 |
| 1 | venue 1 | 2 | 1 | 2009-12-09 00:00:00 | 2009-12-12 00:00:00 | 1 |
| 2 | venue 2 | 3 | 1 | 2009-12-15 00:00:00 | 2009-12-20 00:00:00 | 2 |
+----+---------+------+----------+---------------------+---------------------+----------+
Если вы затем добавили свое условие, в котором указывается, что интересующая дата не находится между датой и датой события, запрос выглядит следующим образом:
select *
from venues ven
left join event_dates evtdt
on (ven.id=evtdt.venue_id)
where not ('2009-12-06' between evtdt.event_from_datetime and evtdt.event_to_datetime)
Что дает результат:
+----+---------+------+----------+---------------------+---------------------+----------+
| id | name | id | event_id | event_from_datetime | event_to_datetime | venue_id |
+----+---------+------+----------+---------------------+---------------------+----------+
| 1 | venue 1 | 2 | 1 | 2009-12-09 00:00:00 | 2009-12-12 00:00:00 | 1 |
| 2 | venue 2 | 3 | 1 | 2009-12-15 00:00:00 | 2009-12-20 00:00:00 | 2 |
+----+---------+------+----------+---------------------+---------------------+----------+
Это мои реальные экспериментальные результаты с вашими данными в MySQL.
Если вы хотите получить бесплатные venue_ids на предлагаемую дату, вы должны написать что-то вроде:
select ven.id, SUM('2009-12-06' between evtdt.event_from_datetime and evtdt.event_to_datetime) as num_intersects
from venues ven left join event_dates evtdt on (ven.id=evtdt.venue_id)
group by ven.id
having num_intersects = 0;
, что дает:
+----+----------------+
| id | num_intersects |
+----+----------------+
| 2 | 0 |
+----+----------------+
это также дает правильный ответ (без изменений) в случае, если у вас есть место проведения без событий в таблице event_date.