Двойной LEFT JOIN

Эдди

Новичок
Что-то никак не соображу, как построить запрос.

Есть три таблицы.
Первая должна лефт джоиться со второй, а вторая так же с третьей.
Это вообще в одном запросе возможно?
 

Эдди

Новичок
PHP:
SELECT *
FROM
tbl1
LEFT JOIN
tbl2
USING(id1)
LEFT JOIN
tbl3
USING(id2)
WHERE ...
Объединяется, вроде, нормально.
Но возникла проблема.

Надо вывести ВСЕ строки первой таблицы.
Каждой строке первой таблицы соответствуют несколько строк второй таблицы.
Это легко устраняется путем SELECT DISTINCT.
Однако каждой записи второй таблицы могут соответствовать тоже несколько записей третьей таблицы,
а может и не соответствовать ни одной.
Задача состоит в том, чтобы, выводя каждую строку первой таблицы, определить, есть ли хоть одна запись в третьей таблице, связанной с первой таблицей через вторую.

И здесь никакой DISTINCT уже не помогает.
Как быть? Буду оч. признателен.
 

Absinthe

жожо
Правильно, только скорее всего вместо USING ты захочешь использовать ON и явно указать столбцы.
 

Эдди

Новичок
выводи, причем тут join?

видать строки уникальные
Да. Не уникальные.
Джойн при том, что в третьей таблице строки могут быть, а могут и не быть.
Вот это и только это надо знать при выводе строк первой таблицы.

10 лет назад при выводе каждой строки первой таблицы скрипт отдельными запросами тупо проверял наличие соответствий в третьей.
Неужели только такой вариант возможен с десятками лишних запросов?
 

С.

Продвинутый новичок
Двойной джойн решается тремя отдельными запросами, а никак не десятками. При правильной оптимизации суммарная ресурсоемкость этих трех запросов равна или меньше тройного джойна.
 

Эдди

Новичок
Двойной джойн решается тремя отдельными запросами, а никак не десятками. При правильной оптимизации суммарная ресурсоемкость этих трех запросов равна или меньше тройного джойна.
Не ищу готовых ответов.
Но хотя бы можно указать, в какую сторону "копать"?
 

С.

Продвинутый новичок
Здесь не надо ничего экзотического и запросы не обязательно разделять. Отсутствие записи в джойне проверяется пустым значением какой-нибудь колонки, которая точно не пуста при найденной записи.
 

Эдди

Новичок
Здесь не надо ничего экзотического и запросы не обязательно разделять. Отсутствие записи в джойне проверяется пустым значением какой-нибудь колонки, которая точно не пуста при найденной записи.
В том -то и дело, что в третьей таблице может быть много записей.
Неужели выход - создать пустой столбец в третьей таблице?
 

С.

Продвинутый новичок
Похоже у тебя в голове сумятица. Давай так, ты сделаешь простую выборку без заумных условий. Выведешь эту выборку, посмотришь на нее глазами, и потом будешь анализировать и добавлять дополнительные условия, отфильтровывая ненужные записи.
 

WMix

герр M:)ller
Партнер клуба
в одной стране может быть много населенных пунктов. в каждом населенном пункте может быть несколько улиц.
PHP:
select *
from countries c
left join towns t on c.id = t.cid
left join streets s on t.id = s.tid
выдаст действительно все улицы во всех городах для всех стран иначе я не понимаю смысла этого запроса.
записей будет ровно столько сколько улиц.
PHP:
select distinct *
from countries c
left join towns t on c.id = t.cid
left join streets s on t.id = s.tid
оставит только уникальные записи вероятнее всего удалятся дубликаты улиц с одинаковым названием в одном и томже городе ( при условии конечно что улица не имеет дополнительной уникальной записи типа id )

в чем вопрос?
 

Эдди

Новичок
Похоже у тебя в голове сумятица. Давай так, ты сделаешь простую выборку без заумных условий. Выведешь эту выборку, посмотришь на нее глазами, и потом будешь анализировать и добавлять дополнительные условия, отфильтровывая ненужные записи.
И не говори. Ужасная сумятица. :)

Гер Мюллер Или я неправильно объяснил, или ты просто не понял.
Мне не нужны все улицы.
Мне нужны все страны, выводимые ОДИН раз, а также нужно знать, есть ли вообще улицы в городах, которые соответствуют каждой стране.
То есть, промежуточная таблица (в данном случае Города) мне не нужна вообще.
А улиц в городе может быть много.
Но при таком джойне (как в примере) я получу столько строк стран, сколько есть улиц в каждом соответствующем городе.

Ну скажите, что в одном запросе это невозможно. Буду криво делать по-старинке. (плАчу уже)
 

С.

Продвинутый новичок
Уже выкладывай реальную задачу. Иначе бесполезное словоблудие начинается.
 

Эдди

Новичок
Уже выкладывай реальную задачу. Иначе бесполезное словоблудие начинается.
Именно Мюллер мою задачу и обозначил.
Надо вывести все страны.
Три таблицы:
Страны
Города
Улицы

Городов может быть много.
В городах тоже много улиц (или их нет вообще)
После страны надо вывести - есть ли улицы -ОК.
Нет улицы (улиц) - не вывожу ничего.

Конечно, таблица страны связана с таблицей города, а таблица города связана с таблицей улицы.
По-моему, очень конкретно.
 

С.

Продвинутый новичок
Не понял. А условие какое? Вывести ВСЕ страны-города-улицы?
 

С.

Продвинутый новичок
Понял. Тут вообще никакие джойны не нужны. У человека view-задача вывести лентой иерархический список, a он ее не то что даже моделю, а вообще хранилищем решает.
 

WMix

герр M:)ller
Партнер клуба
да мне тоже кажется что он гонит..
1 запрос - 1 ответ.
3 запроса - 3 ответа
Эдди
произнеси один раз и до конца "Надо вывести все страны КОТОРЫЕ ...."
 
Сверху