Я не знаю, как работает MySQL внутри, но я уверен, что есть некоторые проблемы с индексами или некоторая метаинформация о количестве таблиц:
mysql> select count(*) from Event;
+----------+
| count(*) |
+----------+
| 5925 |
+----------+
1 row in set (0,01 sec)
mysql> select count(*) from Event where event_id in (select discount_event_id from Discount);
+----------+
| count(*) |
+----------+
| 5901 |
+----------+
1 row in set (0,12 sec)
mysql> select count(*) from Event where event_id not in (select discount_event_id from Discount);
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0,11 sec)
Эти 24
отсутствующих event_id
не имеют смысла. Это просто логически невозможно с моей точки зрения. Не может быть 24
строк, которые есть и не находятся в другом наборе. Или они, или нет.
Кроме того, как следует из некоторых ответов и комментариев, отсутствуют NULL
event_id
, поскольку это rowid:
mysql> select count(*) from Event where event_id is null;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
Что здесь происходит?
Это означает, что 24 event_id
имеют NULL
select count(*) from Event where event_id IS NULL
операторы in
и not in
возвращают NULL
при сравнении со значением NULL
, которое приводится к значению FALSE
поэтому в обоих наборах результатов оно опущено.
NULL
event_id не event_id
так как это поле является строкой таблицы Event
. Смотрите обновление по вопросу.
null