|
|
|
| Есть запрос
SELECT `tbl_1`.*, `tbl_2`.* FROM `tbl_1`, `tbl_2` WHERE `tbl_1`.`id` = $id AND `tbl_1`.`id` = `tbl_2`.`id`
|
Как можно сделать такой же запрос с помощью JOIN?
Т.е. чтоб записи были и в 1ой и 2ой таблице!
И какие еще бывают JOINы?
И в каких случаях их применяют. | |
|
|
|
|
|
|
|
для: а-я
(21.08.2008 в 18:50)
| |
SELECT `t1`.*, `t2`.* FROM `tbl_1` AS `t1` JOIN `tbl_2` AS `t2` ON `t1`.`id` = `t2`.`id`;
|
| |
|
|
|
|
|
|
|
для: а-я
(21.08.2008 в 18:50)
| | Джойны бываю левые, правые и полные. По умолчанию - левый джойн. Это когда объединяются все подходящие данные из первой таблицы и подходящие по связующему полю из правой таблицы, для тех строк из первой таблицы, которым нет соответствующих данных во второй, в результирующей таблице пишется NULL.
Правый JOIN с точностью до наоборот.
Полный JOIN полностью сливает две таблицы, дополняя записи, где нет соответствия NULL -ом.
Пример простейший:
Table 1 Table2
name data name name2
aaaa 123 aaaa aaa1
aaaa 333 bbb 4444
bbb 345 eee 5555
ddd 456
|
Объединения по полю name дадут такие таблицы
LEFT RIGHT FULL
name data name2 name name2 data name data name2
aaaa 123 aaa1 aaaa aaa1 123 aaaa 123 aaa1
aaaa 333 aaa1 aaaa aaa1 333 aaaa 333 aaa1
bbb 345 4444 eee 5555 NULL bbb 345 4444
ddd 456 NULL ddd 456 NULL
eee NULL 5555
|
Теоретически так.
PS Разъезжается . А как столбики на форуме выравнивать? | |
|
|
|
|
|
|
|
для: GeorgeIV
(21.08.2008 в 22:56)
| | Джойны бывают внутренние и внешние. Внешние - это левые или правые. Собственно, бывают и полные, только не в MySQL (как минимум до последнего времени.)
Так вот, по умолчанию джойн как раз внутренний. И запятая, кстати - его семантический эквивалент. | |
|
|
|
|
|
|
|
для: Trianon
(21.08.2008 в 23:45)
| | Смотрю стандарт MySQL - поддерживаются LEFT, RIGHT и FULL.(по крайней мере с версии 4.0) | |
|
|
|
|
|
|
|
для: GeorgeIV
(22.08.2008 в 11:31)
| | В стандарт, говорите?
Я смотрю сюда: http://dev.mysql.com/doc/refman/5.0/en/join.html
В спецификации его нет.
В пользовательских комментариях - куча матюков и примеров костылей для выхода из ситуации.
Куда смотрите Вы?
И кстати, основное возражение было против слов "по умолчанию левый джойн". Этого ни в каких диалектах языка нет.
А FULL - так, мелочи. | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 11:37)
| | Печатный SQL-справочник | |
|
|
|
|
|
|
|
для: GeorgeIV
(22.08.2008 в 11:43)
| | SQL или MySQL ?
В SQL вообще FULL OUTER JOIN конечно есть. Посто в MySQL он не реализован. | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 11:44)
| | SQL, там перечислены практически все основные СУБД - ORACLE, MySQL, MS SQL ... и рассматриваются особенности и отклонения от стандарта у каждой СУБД
PS но наверно, разработчикам следует более доверять, поэтому будем считать что в книге опечатка | |
|
|
|
|
|
|
|
для: GeorgeIV
(22.08.2008 в 11:47)
| | Тем не менее, если в нем и вправду написано "по умолчанию - левый" - его стоит выкинуть. | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 11:49)
| | нет, там написано INNER, это я уже по памяти написал - левый. Тут я неправ, однозначно :-( | |
|
|
|