ForJest
- свежая кровь
О страшном и непонятном LEFT JOIN
В общем постепенно ко мне приходит понимание и сноровка в работе с БД. Но остаются неясности. Возьмем LEFT JOIN. Вроде все понятно.
Table1
(id int,
datafield TEXT
);
Talbe2
(id int,
somefield int not null
);
Делаем
Чудесно. Получили все записи из Table1. Для тех у которых нет соответствия в Table2 t2.* будут NULL.
Усложним задачу. Теперь мы допустим напишем
Теперь собственно вопрос знатокам. Имеет ли такая запись смысл вообще?
Хочется допустим выбрать все записи из Table1, для которых есть соответствующие записи в Table2, причем somefield = 2.
А те которые не имеют вхождения - просто выбрать поля из Table1, оставив поля в Table2 равными NULL.
-------------------------------------------------------------
Т.е. допустим
Table 1:
1 bla
2 john
3 jain
4 maks
Table2:
1 6
2 2
3 2
4 1
Ожидаемый результат выборки:
1 bla null null
2 john 2 2
3 jain 3 2
4 maks null null
Но будет ли так на самом деле, пусть даже учитывая подпорку в виде IFNULL?
Т.е. на злобу дня - как выполнится при подобном случае запрос:
1. Построится левое объединение и поля t2.* будут проверны предложением WHERE... И что будет дальше?
2. Сначала выберутся записи из Table2, соответствующие WHERE, т.е. те у которых somefield = 2 (потому что NULL полей не будет по определению), а потом построится левое объединение? И как оно построится?
3. Ваш вариант.
-------------------------------------
P.S. Данный пост навеян форумом PHP и Новички. Также мне просто самому интересно раз и навсегда разобраться с LEFT JOIN.
В общем постепенно ко мне приходит понимание и сноровка в работе с БД. Но остаются неясности. Возьмем LEFT JOIN. Вроде все понятно.
Table1
(id int,
datafield TEXT
);
Talbe2
(id int,
somefield int not null
);
Делаем
PHP:
SELECT t1.* t2.*
FROM Table1 t1 LEFT JOIN
Table2 t2 ON t1.id=t2.id
Усложним задачу. Теперь мы допустим напишем
PHP:
SELECT t1.* t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id=t2.id
WHERE (t2.somefield = 2) OR (ISNULL(t2.somefield)=1)
Хочется допустим выбрать все записи из Table1, для которых есть соответствующие записи в Table2, причем somefield = 2.
А те которые не имеют вхождения - просто выбрать поля из Table1, оставив поля в Table2 равными NULL.
-------------------------------------------------------------
Т.е. допустим
Table 1:
1 bla
2 john
3 jain
4 maks
Table2:
1 6
2 2
3 2
4 1
Ожидаемый результат выборки:
1 bla null null
2 john 2 2
3 jain 3 2
4 maks null null
Но будет ли так на самом деле, пусть даже учитывая подпорку в виде IFNULL?
Т.е. на злобу дня - как выполнится при подобном случае запрос:
1. Построится левое объединение и поля t2.* будут проверны предложением WHERE... И что будет дальше?
2. Сначала выберутся записи из Table2, соответствующие WHERE, т.е. те у которых somefield = 2 (потому что NULL полей не будет по определению), а потом построится левое объединение? И как оно построится?
3. Ваш вариант.
-------------------------------------
P.S. Данный пост навеян форумом PHP и Новички. Также мне просто самому интересно раз и навсегда разобраться с LEFT JOIN.