Войти  Зарегистрироваться


Выборка из двух таблиц в MySQL. Оператор JOIN.

(28 голоса, среднее 4.57 из 5)

Нередко web-разработчикам приходится сталкиваться с необходимостью выбора данных из нескольких таблиц одновременно. Думаю, никого из читателей не
тревожит вопрос о том стоит ли вообще использовать такие запросы. Ответ очевиден. Такие запросы уменьшают число обращений к базе данных, тем самым
уменьшая время выполнения скрипта и нагрузку на сервер. Давайте разберёмся как пользоваться многотабличными запросами.  
Допустим, у нас есть две таблицы:

Таблица tbl1:

id name
1 А
2 Б
3 В

Таблица tbl2:

id letter
2 Г
3 Д
4 Е

Произведём простейший запрос к двум таблицам.

SELECT * FROM tbl1,tbl2 WHERE tbl1.id=tbl2.id


В результате этого запроса получится следующая таблица:

id name id letter
2 Б 2 Г
3 В 3 Д

То есть, данный запрос строго выбирает из двух таблиц только те строки, столбцы id которых совпадают.
Аналогичного результата можно добиться с помощью следующего запроса:

SELECT * FROM tbl1 JOIN tbl2 WHERE tbl1.id=tbl2.id

Для формирования условия в запросах, использующих объединение JOIN, вместо ключевого слова WHERE предпочтительно использовать ключевое слово ON,
как это продемонстрировано в следующем листинге:

SELECT * FROM tbl1 JOIN tbl2 ON tbl1.id=tbl2.id


Выше было продемонстрировано перекрестное объединение таблиц tbl1 и tbl2. При это результирующая таблица содержит комбинации строк обеих таблиц, удовлетворяющих
условию tbl1.id = tbl2.id. Левое объединение (LEFT JOIN) позволяет включить в результирующую таблицу строки "левой" таблицы tbl1, которой не нашлось соответствие
в "правой" таблице tbl2. Смотрите следующий пример:

 

SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id


Результатом будет следующая таблица

id name id letter
1 А NULL NULL
2 Б 2 Г
3 В 3 Д

Как видно из этого примера, записи в таблице tbl1 со значением id = 1 не нашлось соответствия в таблице tbl2, т.к. поле id в ней принимает значения 2,3,4. Тем не менее
в результирующую таблицу запись включена, при этом значения полей из таблицы tbl2 принимают значение NULL. Следует заметить, что для задания условия вместо ключевого слова
WHERE при левом и правом объединениях используется ключевое слово ON.
В следующем примере демонстрируется "правое" объединение при помощи конструкции RIGHT JOIN.

SELECT * FROM tbl1 RIGHT JOIN tbl2 ON tbl1.id=tbl2.id


Результирующая таблица:

id name id letter
2 Б 2 Г
3 В 3 Д
NULL NULL 4 Е

Как видим, при правом объединении возвращаются строки, удовлетворяющие условию tbl1.id = tbl2.id, и строки "правой" таблицы tbl2, которым не нашлось соответствия в левой таблице tbl1.

Все вопросы предлагаю обсудить на форуме.

Комментарии
⇓⇑ Добавить новый Поиск RSS
Имя:
Email:
 
Тема:
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Пожалуйста, введите проверочный код, который Вы видите на картинке.
Написал: Константин  - Полезно! |2010-06-15 23:09:58
avatar Полезно! :)
Написал: Зайва Игорь Леонидович  - Соединение выборки в таблицу |2010-08-06 17:30:37
avatar Хороший примерчик, а как сделать, если несколько таблиц? :0 Пробую что-то типа:

SELECT * FROM tbl1, tbl2 LEFT JOIN tbl3 ON tbl2.id=tbl3.id

Пока не выходит - ерунда на выходе. Эх, придется поупражняться еще...
Написал: Зайва Игорь Леонидович |2010-08-06 17:36:56
avatar Плохо, что нельзя минуту редактировать комментарий...

Не нашел подходящий топик, поэтому извиняюсь, что чуток не в тему. Хочу сделать выборку из нескольких категорий таблицы, не могу синтаксис найти как правильно. Например, вытащить из 2-х категорий посты:

WHERE tbl.cat = '1' && tbl.cat = '2'

Не подходят, думаю, что-то типа этого должно быть:

WHERE tbl.cat = ('1','2')

А как правильно, подсскажите, пожалуйста, мыло указал в поле.
Написал: admin |2010-08-06 17:53:27
avatar Попробуйте так
SELECT * FROM tbl1 JOIN tbl2 LEFT JOIN tbl3 ON tbl2.id=tbl3.id
только после SELECT одной лишь звёздочки мало, если хотите выбирать из всех 3-х таблиц. Например,
SELECT tbl1.*, tbl2.*, tbl3.* FROM tbl1 JOIN tbl2 LEFT JOIN tbl3 ON tbl2.id=tbl3.id
Написал: Зайва Игорь Леонидович |2010-08-06 18:15:06
avatar Спасибо огромное, так работает:

SELECT t1.*, t2.*, t3.* FROM t1 JOIN t2 LEFT JOIN t3 ON t2.id=t3.id

Нужно для первой таблицы "JOIN", а каждой следующей таблицы "LEFT JOIN" писать, а я для всех "LEFT JOIN" поначалу. Вроде что-то путное на выходе получил, пошел проверять.

Не совсем понял из статьи, параметр WHERE можно после объединения дописывать, если нужно проверить ячейки первой таблицы на "нулл", по идее, они к объединению не имеют отношения?

П.С. Странно как-то в опере вывод проходит - не дает страницу прокрутить, даже если загрузку остановить :(

П.П.С. Со звездочкой ошибся, точно :confused:

П.П.П.С. Здорово, что страницу не закрыл и обновил - мыло не упало. Спасибо еще раз огромнейшее за ответ, побольше бы еще сложненьких примеров, было б вообще супер!
Написал: Зайва Игорь Леонидович |2010-08-06 18:37:14
avatar С объединением полный капец получился, почему - не знаю, на оф.сайте нет нормальных примеров. При запросе, типа:

SELECT t1.*, t2.*, t3.* FROM t1 AS t01 JOIN t2 AS t02 LEFT JOIN t3 AS t03 ON t2.id=t3.id

Вылетает портянка в сотню метров и всё зацикливается. Толи это "аз" виноват, толи еще чего ??? Пробую всяко-разно - либо еррор запроса, либо портянка. Жаль, фокус не удался :(

Спасибо за внимание.
Написал: admin |2010-08-06 18:45:43
avatar Извините, уважаемый, если вы даёте таблице псевдоним через AS, то уже и в SELECT их используйте.

SELECT t01.*, t02.*, t03.* FROM t1 AS t01 JOIN t2 AS t02 LEFT JOIN t3 AS t03 ON t02.id=t03.id

WHERE действительно используется для того, чтобы указать по какому условию выбирать из первой таблицы.
Написал: Зайва Игорь Леонидович |2010-08-06 19:06:12
avatar М... я ошибся (опечатка), да я так и делал - все равно зацикливается. Получаю на выходе около 10к строк, при чем все - одна и та же, все данные повторяются. Перепробовал все варианты - не катит. Можно с вами по асе пообщаться? - Вещь вроде пустяковая, но уже весь день просидел, скоро петухи запоют, а так и не могу никак получить данные из таблицы, ранее делал несколько запросов, но теперь учусь более сложным вещам и хочу всё взять одним. Заодно и примерчик добавите, думаю, полезно другим тоже будет. :whistle: :unsure:
Написал: Владимр  - Выборка из двух таблиц в MySQL. Оператор JOIN. |2010-10-05 16:23:47
avatar Интересная статья. Вопрос. Как сделать, чтобы выводило строки в, которых id не совпадают. Пробывал так:
SELECT * FROM tbl1 JOIN tbl2 WHERE tbl1.id!=tbl2.id
Не получается.
Заранее большое спасибо
Написал: Зайва Игорь Леонидович |2010-10-05 17:05:03
avatar Владимир, попробуйте так (нашел в сети):

SELECT * FROM table1 as t1,* as t2 WHERE t1.f=t2.f && t1.unique_key>t2.unique_key

Написал: admin |2010-10-05 20:40:49
avatar Интересный вопрос. Значит, с одной таблицы должны выбираться все строки, а с другой только те, id которых не встречается в первой таблице?
Написал: admin |2010-10-06 08:37:08
avatar Предлагаю решение, которое я выложил на форуме.
http://www.webextends.net/forum/viewtopic.php?f=2&t=2
Написал: Владимир  - Выборка из двух таблиц в MySQL. Оператор JOIN. |2010-10-06 10:02:59
avatar Спасибо за быстрый ответ. Попробывал оба способа, но к сожалению не добился нужного результата. Уточняю вопрос, необходимо из первой таблицы достать все строки id, которых не совпадают с id второй таблицы. Тоесть, если взять пример из статьи, на выходе должно получиться приблизительно следующее
id name
1 А
тоесть вытягивается строчка из первой таблицы, где id=1, которого нет в таблице 2. Спасибо за поддержку. Если сам догадаюсь, обязательно отпишусь
Написал: admin |2010-10-06 10:23:37
avatar Это элементарно тогда. Нужно использовать вложеный запрос. Если не разберетесь, напишу вечером на форуме решение.
Написал: Владимир  - Выборка из двух таблиц в MySQL. Оператор JOIN. |2010-10-07 09:00:41
avatar К сожалению, я пока не очень разбираюсь во вложенных запросах. Так что жду помощи. Заранее огромное спасибо.
Написал: admin |2010-10-07 09:17:17
avatar Ответ запостил. http://webextends.net/forum/viewtopic.php?f=2&t=3
Написал: Владимир  - Выборка из двух таблиц в MySQL. Оператор JOIN. |2010-10-07 10:12:17
avatar Супер. Получилось. Огромнейшее спасибо
Написал: admin |2010-10-07 10:14:20
avatar Всегда пожалуйста! Обращайтесь! :)
Написал: fastrider |2011-10-30 20:38:01
avatar SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id AND tbl2.id IS NULL

или

SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id WHERE tbl2.id IS NULL

но вложенные запросы не нужны точно
Написал: admin |2011-10-30 23:16:42
avatar Спасибо за хорошую идею! Однако, есть пара моментов. Первый запрос работать корректно не будет - он выберет все строки с первой таблицы. Второй подходит хорошо и вернет те же результаты, что и при вложенном запросе. И третье: ни один из запросов не выбирает строки id которых есть во 2-й таблице, но нет в первой.
Написал: Александр  - Помогите пожалуйста |2010-11-01 05:14:28
avatar Есть две таблицы. В каждой есть ячейка login. Нужно проверить на наличие ячейки login с значением $login.

Для одной таблицы это выглядит так:
$result = mysql_query("SELECT id FROM `users` WHERE login='$login'";);

Зарание спасибо
Написал: admin |2010-11-05 15:58:40
avatar Со второй аналогично! Не понял вопроса... Если нужно сделать запрос к 2-м таблицам, то в статье это хорошо описано.