Mysql LEFT JOIN : примеры запросов, схемы, объяснение

 
LEFT JOIN используется для построения сложных объектов из нескольких таблиц.
 
Однако, сложно вообразить процесс выборки записей из mysql.
 
Сегодня, мы детально рассмотрим запросы и схемы.
 
Разберемся с LEFT JOIN на практических примерах.
 

Что нам известно о LEFT JOIN ?

 
  • используется при select запросах из нескольких таблиц
  • можно подключать данные из не ограниченного количества таблиц
  • при построении весьма сложных таблиц, 5 и более, - лучше разбить на отдельные запросы (мы покажем как, на примере).
 

Пример

 
Допустим у нас есть две таблицы: отзывы, и пользователи сайта (которые пишут отзывы).
При построении списка отзывов, нужно указать кто его автор. Здесь и поможет нам запрос с LEFT JOIN , который прицепит нужные поля из таблицы пользователя к отзыву!
 
Таблица отзывы:
 
review
 
id, dt, text, id_customer
 
mysql таблица отзывы
 
 
Таблица пользователи:
 
customer
 
id, login, email, avatar
 
mysql таблица пользователи
 
 
Теперь сформируем обьекты для вывода данных.
 
SELECT r.id as r_id, r.text, r.dt, c.login, c.email, c.avatar 
FROM review r 
LEFT JOIN customer c ON r.id_customer = c.id
 
Что получилось?
 
mysql запрос с left join пример
 
В запросе мы использовали алиасы таблиц review -> r , customer -> c
Чтобы избежать конфликта одинаковых названий столбиков.
 
Также мы указали r_id для идентификатора отзыва. Если нужно выбрать id пользвателя, просто допишите к SELECT c.id as c_id. 
 
Давайте рассмотрим запрос подробнее на схематическом примере:
 
схема mysql left join
 
 

Как уточнить выборку с LEFT JOIN запросом?

 
Все просто.. вы можете исопльзовать привычные WHERE, GROUP BY, HAVING
 
Например, нужно выбрать отзывы только определенных пользователей:
 
SELECT r.id as r_id, r.text, r.dt, c.login, c.email, c.avatar 
FROM review r 
LEFT JOIN customer c ON r.id_customer = c.id
WHERE r.id_customer IN (1,2,3)
 
Выберет отзывы с дополненными полями логин, емайл, аватар, - но только для пользователей с id 1,2,3
 
Давайте уточним дату:
 
SELECT r.id as r_id, r.text, r.dt, c.login, c.email, c.avatar 
FROM review r 
LEFT JOIN customer c ON r.id_customer = c.id
WHERE r.id_customer IN (1,2,3) AND (r.dt BETWEEN '2015-08-01 16:55:48' AND '2020-08-01 16:55:48')
 
Отлично! Теперь имеем отзывы пользователей 1,2,3 за 5 лет.
А что если их больше 50? Необходимо сортировать по дате, лимитировать, и выводить пагинацию...
 
SELECT r.id as r_id, r.text, r.dt, c.login, c.email, c.avatar 
FROM review r 
LEFT JOIN customer c ON r.id_customer = c.id
WHERE r.id_customer IN (1,2,3) AND (r.dt BETWEEN '2015-08-01 16:55:48' AND '2020-08-01 16:55:48') 
ORDER BY r.dt DESC 
LIMIT 0, 10
 
Выберет последние 10 по дате.
 
Как соединять 3, 4, 5 и более таблиц при помощи LEFT JOIN
 
Для этого нужно просто дописать столько LEFT JOIN таблиц сколько нужно. 
Кстати, таблицы соединять можно по промежуточным! Это весьма удобно на практике... такая свзяь называется многие-ко-многим.
 
Рассмотрим пример, основываясь на предыдущих:
 
SELECT 
 r.id as r_id, r.text, r.dt, 
 c.login, c.email, c.avatar,
 ll.dt as last_login,
 co.is_online 
FROM review r 
LEFT JOIN customer c ON r.id_customer = c.id
LEFT JOIN last_login ll ON ll.id_customer = c.id 
LEFT JOIN customer_online co ON co.id_customer = c.id
 
К запросу мы добавили еще данные о последнем входе пользователя и статусе онлайн.
 
Надеемся, теперь вам будет проще писать сложные запросы.
 
Задавайте вопросы в комментариях, ведь каждая задача уникальна. 
Постараемся помочь в решении.
 
Смотрите также хорошую коллекцию mysql запросов.


Дальше: Разработка интернет-проектов в Берлине, - поддержка русскоязычным в Германии


Дискуссия по теме     0 Комментариев
Добавить комментарий
Просмотров: 263