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




MySQL.RU - Webboard



Вернуться
JOIN-ы и зацепленные на них таблицы. (Андрей) 25/02/2011 - 10:42:14
      Re: JOIN-ы и зацепленные на них таблицы -упростим (Андрей) 25/02/2011 - 11:26:14
      Re: JOIN-ы и зацепленные на них таблицы -упростим (Akina) 28/02/2011 - 09:37:40
      Re: JOIN-ы и зацепленные на них таблицы -упростим (Андрей) 11/03/2011 - 15:17:49

> Original message text:
> From: Андрей - 25/02/2011 - 10:42:14
> Subject:JOIN-ы и зацепленные на них таблицы.
> -----------------
> Имеем базу задач, в которой есть две ссылки на людей, связанных с задачей. Человек может быть только один, может не быть ни одного. Ранее делалась выборка с двумя джоинами, запрос отрабатывал за достаточно короткий период времени.
> SELECT a.*, b.name, b.place, c.name, c.place FROM task AS a LEFT JOIN person AS b ON b.id=a.person1 LEFT JOIN person AS c ON c.id=a.person2
> Теперь для людей размещение перенесли в отдельную таблицу из-за слияния с другой базой.
> SELECT a.*, b.name, d.placename, c.name, e.placename FROM task AS a LEFT JOIN person AS b ON b.id=a.person1 LEFT JOIN person AS c ON c.id=a.person2, place AS d, place as e WHERE d.id=b.place AND e.id=c.place
> работает только там, где оба джоина зацеплены, если в b или c нули, WHERE не выполняется, и такие записи теряются
>
> Если связь на помещения вынести в условия джоина:
> SELECT a.*, b.name, d.placename, c.name, e.placename FROM task AS a LEFT JOIN person AS b ON (b.id=a.person1 AND d.id=b.place)LEFT JOIN person AS c ON (c.id=a.person2 AND e.id=c.place), place AS d, place as e
> то происходит перемножение таблиц, получаем верный набор записей, но на каждую запись таблицы a возвращается количество строк, равное количеству мест в таблице d или e. Фактически, для джоиненой таблицы происходит только выбор по ней и полной таблицы размещения.
>
> Если побить на юнион из 4 запросов (оба лица, только первое, только второе, ни одного, дополняя неиспользованные джоины нуллами для соответствия кол-ва столбцов) скорость выполнения запроса падает более чем на порядок.
>
> Есть ли какое-либо решение "малой кровью" для такой задачи?
>


From: Андрей - 25/02/2011 - 11:26:14
Subject:JOIN-ы и зацепленные на них таблицы -упростим
-----------------
Таблицы a, b, c.

b цепляется на a, под неё выбираются данные из с.

SELECT a.*, b.field FROM a LEFT JOIN b ON b.id=a.b_link - джоин работает нормально, выбираются все строки a и на них джоинится b
Количество строк равно кол-ву строк a, всё ок.
Теперь попытаемся взять данные из c.

SELECT a.*, b.field, c.field1 FROM a LEFT JOIN b ON b.id=a.b_link, c WHERE c.id=b.c_link - если пытаемся получить данные из c, связанные с полем в джоиненной таблице b, через WHERE, строки а, для которых в b остается null, отваливаются, и фактически джоин не работает, получаем то же, что и сцепку b на a через where вместо join
Количество строк равно количеству строк а, на которые зацеплено b, то, что получали до джоину теряем.

SELECT a.*, b.field, c.field1 FROM c, a LEFT JOIN b ON (b.id=a.b_link AND c.id=b.c_link) выбирает всё, но перемножает таблицы, так как проверка второго условия выглядит как выбор SELECT a, c без условий, так как второе условие - это условие джоина, а не выборки
Получаем количество строк, равное произведению кол-ва строк в a на количество строк в c.

Как получить данные из a, зацепить на них джоином данные из b, а на и взять поле из c?


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

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

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



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