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




MySQL.RU - Webboard



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

> Original message text:
> 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 и также как и с первым указываем имя таблицы и условие выборки, затем, если нужно, указываем условие выборки из таблицы оригинала.
>
> Надеюсь описание не слишком скучное и глупое, если честно - впервые пишу подобные вещи, поэтому, прошу, не судите строго.
> Удачного составления запросов.
>


From: Hamyachok - 22/09/2010 - 14:03:13
Subject:Разобрался в использовании JOIN(для новичков)
-----------------
Извините, забыл дописать.
Во втором запросе, где выбираем сотрудника(получателя), после LEFT JOIN нужно указать `employees`, как таблицу из которой выбираем.


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

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

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



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