Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Разобрался в использовании JOIN(для новичков) (Hamyachok) 22/09/2010 - 13:57:29
      Re: Разобрался в использовании JOIN(для новичков) (Hamyachok) 22/09/2010 - 14:03:13



From: Hamyachok - 22/09/2010 - 13:57:29
Subject:Разобрался в использовании JOIN(для новичков)
-----------------
Не сочтите за глупость.(если модератор посчитает правильным удалить - так тому и быть).
Долго не мог понять логику работы JOIN. Наконец разобрался с LEFT JOIN, возможно мой рассказ как новичка поможет таким же как я?!
Как известно - JOIN соединяет таблицы и позволяет выводить данные по связанным полям с помощью одного запроса. Логика такова - берете 2 таблицы, указываете что выбирать из первой(оригинал), с какой таблицей связывать, по какому критерию производить выборку из второй и условие выбора из первой(по необходимости).
Но у меня возник вопрос - а как быть, если есть повторяющиеся поля в двух таблицах, которые перезаписывают друг друга при выборке, да и вообще, зачем мне тащить 15 параметров второй таблицы, если мне нужно всего 2???!!!!.
Постораюсь все объяснить на примере:
Есть 3 таблицы:
1. `invoices` (накладные)
2. `suppliers` (поставщики)
3. `employees` (сотрудники)
Задача - такая, вывести данные о накладной, т.е. данные таблицы `invoices`, с уточнением параметров выборки.
Структуры таблиц:
`invoices`:
id, Name, supplier, recipient, date_of_motion.....(остальные поля нам не нужны)
`suppliers`:
id, Name, .....
1, Главный склад
2, Второй склад
3, Третий склад
`employees`:
id, Name, .....
1, Иванов
2, Сидоров
3, Васильев
Запись в таблице `invoices`:
id, Name, supplier, recipient, date_of_motion
1, 1, 1, 1, 2010-08-10
2, 3, 2, 3, 2010-08-12
Как видно в таблице invoices, в полях supplier и recipient указаны id номера таблиц `suppliers` и `employees` соответственно.
Нужно вывести накладные попадающие в интервал с BeginDate = 2010-08-01 - EndDate = 2010-08-11 (включительно), с указанными по человечески поставщиком и получателем.
Составляем запрос(получение поставщика) - правильный!:
select `invoices`.*, `suppliers`.`Name` as supplier from `invoices` left join `suppliers` on `invoices`.supplier = `suppliers`.`id` where `date_of_motion` >= BeginDate and `date_of_motion` <= EndDate.
Результат:
id, Name, supplier, recipient, date_of_motion
1, 1, Главный склад, 1, 2010-08-10
Как видите результат нас не устраивает. Т.е. нужно добавить еще одно условие:
left join on `employees`.`id` = `invoices`.`recipient`
и в select - `employees`.`Name` as recipient.
Тогда получим - запрос:
select `invoices`.*, `suppliers`.`Name` as supplierб `employees`.`Name` as recipient from `invoices` left join `suppliers` on `invoices`.supplier = `suppliers`.`id` left join on `employees`.`id` = `invoices`.`recipient` where `date_of_motion` >= BeginDate and `date_of_motion` <= EndDate.
При указании дополнительного JOIN'a запятая не ставиться, но в select нужно обязательно указать поле, которое мы берем иначе, получиться - хрень)))
Теперь результат:
id, Name, supplier, recipient, date_of_motion
1, 1, Главный склад, Иванов, 2010-08-10
Т.е. то что нам и нужно.
Еще раз задача - вывести данные о накладной выданной сотруднику на товар в определенном интервале, выбрав при этом из двух других таблиц имя поставщика и получателя.
По-моему мы достигли результата.
Таким образом, подведем итог:
При использовании JOIN:
в select указываем интересующие нас поля(если нужно выбирать что-то конкретное, а не всю таблицу целиком), после from указываем таблицу оригинал(по которой проводится выборка), далее LEFT JOIN, далее таблицу с которой связываемся, ON, далее условие совпадения данных из таблицы оригинала и той с которой связались, далее, по необходимости, указываем еще LEFT JOIN и также как и с первым указываем имя таблицы и условие выборки, затем, если нужно, указываем условие выборки из таблицы оригинала.

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


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
37481



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |