MySQL. Помогите разобраться с JOIN
Для примера, созданы 3 таблицы:
t1
+--+
|id|
+--+
t2
+--+----+-----+
|id|val2|t1_id|
+--+----+-----+
t3
+--+----+-----+
|id|val3|t1_id|
+--+----+-----+
t1 связана с t2 и t3 связью один-ко-многим по полю t2.t1_id и t3.t1_id соответственно.
Вопрос. Нужно составить такой запрос, чтобы select t1.id работал следующим образом:
- Если в t2 и t3 пустые, то пустая выборка.
- Если в t2.val2 is null или t2.val2 < 100, а t3 пустая, то выборка не пустая.
- Если в t3.val3 is null или t3.val3 < 100, а t2 пустая, то выборка не пустая.
- Если в t2.val2 is null или t2.val2 < 100 или в t3.val3 is null или t3.val3 < 100, то выборка не пустая.
Вообще, основная проблема, из-за которой я все это написал, заключается в том, что если вдруг одна из таблиц (t2 или t3) пустая, то срабатывает условие на null (t2.val2 is null или t3.val3 is null соответственно), поэтому в п.4 получается всегда true и выборка не пустая.
Надеюсь, внятно написал.
UPD. Просили ясности. Постараюсь конкретизировать.
select id from t1
left join t2 on t1.id = t2.t1_id
left join t3 on t1.id = t3.t1_id
where ((t2.val2 < 100) or (t2.val2 is NULL) or
(t3.val3 < 100) or (t3.val3 is NULL));
Такой запрос возвращает id из t1, если, допустим, в t2 есть запись с t1_id = t1.id и val2 < 100 или null. Но если t2 - это пустая таблица, то почему-то выполняется условие t2.val2 is NULL. Как этого избежать?
UPD2. Упросил задачу. Вопрос остался. Убираем t3: остаются только t1 и t2. В таблице t1 1 запись, в таблице t2 нет ни одной. Делаю запрос
select id from t1
left join t2 on t1.id = t2.t1_id
where ((t2.val2 < 100) or (t2.val2 is NULL));
который возвращает id этой одной записи из t1. Как его изменить, чтобы он возвращал только такие записи из t1, для которых в t2 есть совпадающие по ключу записи, удовлетворяющие условию?
Ответы (1 шт):
Я нашел ответ. Достаточно разбить запрос на 2, изменить left join на inner join и объединить результаты через union.
select id from t1
inner join t2 on t1.id = t2.t1_id
where ((t2.val2 < 100) or (t2.val2 is NULL))
union
select id from t1
inner join t3 on t1.id = t3.t1_id
where ((t3.val3 < 100) or (t3.val3 is NULL));