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 работал следующим образом:

  1. Если в t2 и t3 пустые, то пустая выборка.
  2. Если в t2.val2 is null или t2.val2 < 100, а t3 пустая, то выборка не пустая.
  3. Если в t3.val3 is null или t3.val3 < 100, а t2 пустая, то выборка не пустая.
  4. Если в 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 шт):

Автор решения: he1ex-tG

Я нашел ответ. Достаточно разбить запрос на 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));
→ Ссылка