Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с LEFT JOIN + INNER JOIN / 25 сообщений из 42, страница 1 из 2
05.02.2015, 13:32:37
    #38872262
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
Здравствуйте!
Есть таблицы Т1, Т2, Т3.
Т1 с Т2 связана не жестко, Т2 с Т3 жестко.
Покажет ли все значения Т1, если в Т3 нет значения?
Код: sql
1.
2.
3.
SELECT * FROM t1
LEFT JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t3.t2_id = t2.id
...
Рейтинг: 0 / 0
05.02.2015, 13:36:04
    #38872266
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
Напрмер, Т1 - план прибытия автомобилей
Т2 - таблица многие-ко-многим "Водители автомобилей"
Т3 - таблица Водители, Т4 - автомобили.

Так что Т2 с Т3 и Т4 требуется связать жестко, т.к. не бывает Т2 без Т3 и Т4.
А Т1 с Т2 не жестко, т.к. в плане можгут еще не назначить транспорт.

Или в этом случае надо связывать ВСЕ таблицы не жестко, чтобы отобразились все значения Т1?
...
Рейтинг: 0 / 0
05.02.2015, 13:37:09
    #38872267
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
Нужно показать все значения Т1.
...
Рейтинг: 0 / 0
05.02.2015, 13:39:38
    #38872270
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
5 минут потрачено на написание сообщений... хотя достаточно было 2 минут, чтобы попробовать и получить ответ.
...
Рейтинг: 0 / 0
05.02.2015, 13:42:52
    #38872272
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
svnvladЗдравствуйте!
Есть таблицы Т1, Т2, Т3.
Т1 с Т2 связана не жестко, Т2 с Т3 жестко.
Покажет ли все значения Т1, если в Т3 нет значения?
Код: sql
1.
2.
3.
SELECT * FROM t1
LEFT JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t3.t2_id = t2.id



Нет. Покажет только Т1, которые есть и в Т3
...
Рейтинг: 0 / 0
05.02.2015, 13:45:19
    #38872275
Запрос с LEFT JOIN + INNER JOIN
svnvlad,

используй вложенность при написании джойнов:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * 
  FROM t1
    LEFT JOIN t2 
      INNER JOIN t3 
      ON t3.t2_id = t2.id
   ON t2.t1_id = t1.id
...
Рейтинг: 0 / 0
05.02.2015, 13:45:20
    #38872276
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
svnvladНужно показать все значения Т1.
Код: sql
1.
2.
3.
from t2
inner join t3
right join t1
...
Рейтинг: 0 / 0
05.02.2015, 13:49:13
    #38872280
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
svnvladЗдравствуйте!
Есть таблицы Т1, Т2, Т3.
Т1 с Т2 связана не жестко, Т2 с Т3 жестко.
Покажет ли все значения Т1, если в Т3 нет значения?
Код: sql
1.
2.
3.
SELECT * FROM t1
LEFT JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t3.t2_id = t2.id



Сори, неверно прочитал пост.

Такое пишется

Код: sql
1.
2.
3.
SELECT * FROM t1
LEFT JOIN ( t2 INNER JOIN t3 ON t3.t2_id = t2.id )
ON t2.t1_id = t1.id



либо просто делаешь

Код: sql
1.
2.
3.
SELECT * FROM t1
LEFT JOIN t2 ON t2.t1_id = t1.id
LEFT JOIN t3 ON t3.t2_id = t2.id



потому что по данным у тебя может не быть записи в t2 только по причине несоблюдения условия t2.t1_id = t1.id.
Если же может когда-то несоблюдаться и t3.t2_id = t2.id , то надо писать со скобками.
...
Рейтинг: 0 / 0
05.02.2015, 16:54:30
    #38872596
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
MasterZivпотому что по данным у тебя может не быть записи в t2 только по причине несоблюдения условия t2.t1_id = t1.id.
Если же может когда-то несоблюдаться и t3.t2_id = t2.id , то надо писать со скобками.
Допустим такая ситуация:
В Т1 есть строка, но ссылка на Т2 в ней пустая. Не пропадет ли из выдачи данная строка по причине жесткой связи 2 и 3?
P.S. 2 и 3 всегда связаны, null-ов там не может быть.
...
Рейтинг: 0 / 0
05.02.2015, 17:22:53
    #38872641
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
svnvladMasterZivпотому что по данным у тебя может не быть записи в t2 только по причине несоблюдения условия t2.t1_id = t1.id.
Если же может когда-то несоблюдаться и t3.t2_id = t2.id , то надо писать со скобками.
Допустим такая ситуация:
В Т1 есть строка, но ссылка на Т2 в ней пустая. Не пропадет ли из выдачи данная строка по причине жесткой связи 2 и 3?
P.S. 2 и 3 всегда связаны, null-ов там не может быть.

Ещё раз.

Вариант (1)
Код: plaintext
T1--left join--( T2 -- join -- T3 )
Запись из T1 не может вообще никогда пропасть, потому что T1--left join -- (ВСЁ_ЧТО_УГОДНО) -- записи из T1 будут всегда.


Вариант (2)
Код: plaintext
T1--left join-- T2 -- left join -- T3
Запись из T1 не может также никогда пропасть, потому что T1--left join -- (ВСЁ_ЧТО_УГОДНО) -- left join (ВСЁ_ЧТО_УГОДНО)
-- записи из T1 будут всегда.

Тебе нужно только определиться, когда должны появляться записи из T2.

всегда когда они есть, но соотв. записи из T3 - только если они есть. (вариант (2) )

только когда записи есть одновременно и в T2, и в T3 (вариант (1) )

Но если ты говоришь, что T2 и T3 всегда имеют связанные записи, то разницы, какой вариант использовать нет вообще.
...
Рейтинг: 0 / 0
05.02.2015, 17:29:27
    #38872646
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
MasterZivЕщё раз.

Вариант (1)
Код: plaintext
T1--left join--( T2 -- join -- T3 )
Запись из T1 не может вообще никогда пропасть, потому что T1--left join -- (ВСЁ_ЧТО_УГОДНО) -- записи из T1 будут всегда.


Вариант (2)
Код: plaintext
T1--left join-- T2 -- left join -- T3
Запись из T1 не может также никогда пропасть, потому что T1--left join -- (ВСЁ_ЧТО_УГОДНО) -- left join (ВСЁ_ЧТО_УГОДНО)
-- записи из T1 будут всегда.

Тебе нужно только определиться, когда должны появляться записи из T2.

всегда когда они есть, но соотв. записи из T3 - только если они есть. (вариант (2) )

только когда записи есть одновременно и в T2, и в T3 (вариант (1) )


Все записи из Т1, и, если есть, то записи из Т2--inner join--Т3.
T1a - null - null
T1b - null - null
T1c - T2a - T3а
T1d - T2b - T3b
T1e - null - null

Можно ли сделать без скобок?
Код: plaintext
T1--left join-- T2 -- inner join -- T3 
...
Рейтинг: 0 / 0
05.02.2015, 17:39:01
    #38872660
Запрос с LEFT JOIN + INNER JOIN
svnvladМожно ли сделать без скобок?
Код: plaintext
T1--left join-- T2 -- inner join -- T3 

я же тебе показал вложенные джойны, без скобок.:Добрый Э - Эхsvnvlad,

используй вложенность при написании джойнов:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * 
  FROM t1
    LEFT JOIN t2 
      INNER JOIN t3 
      ON t3.t2_id = t2.id
    ON t2.t1_id = t1.id


чем-то не устроило?
...
Рейтинг: 0 / 0
05.02.2015, 20:33:58
    #38872833
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
возможно можно и без скобок, я не знаю уке в мускле, да и вообще не морочился никогда, либо все left , либо все inner.
...
Рейтинг: 0 / 0
05.02.2015, 20:38:42
    #38872835
Запрос с LEFT JOIN + INNER JOIN
MasterZivвозможно можно и без скобок, я не знаю уке в мускле, да и вообще не морочился никогда, либо все left , либо все inner.я смотрю, тут одни писатели собрались... уже два раза привел пример, как оно должно работать без скобок, на вложенных джойнах. а они всё сомневаются - возможно / невозможно.
...
Рейтинг: 0 / 0
05.02.2015, 20:59:39
    #38872845
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
Добрый Э - Эх
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * 
  FROM t1
    LEFT JOIN t2 
      INNER JOIN t3 
      ON t3.t2_id = t2.id
   ON t2.t1_id = t1.id

Шайтан! И правда работает!
http://sqlfiddle.com/#!2/2220e/1
Впервые вижу, что два ON последовательно работают.

Но лично я написал бы через два LEFT JOIN-а, потому как в объемных запросах слишком неожиданно встретить два ON подряд, особенно, когда их JOIN на экран выше.
...
Рейтинг: 0 / 0
06.02.2015, 04:27:49
    #38872948
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
miksoftНо лично я написал бы через два LEFT JOIN-а, потому как в объемных запросах слишком неожиданно встретить два ON подряд, особенно, когда их JOIN на экран выше.
LEFT JOIN-ы медленней работают, чем INNER JOIN.
...
Рейтинг: 0 / 0
06.02.2015, 04:29:35
    #38872949
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
Добрый Э - ЭхsvnvladМожно ли сделать без скобок?
Код: plaintext
T1--left join-- T2 -- inner join -- T3 

я же тебе показал вложенные джойны, без скобок.:Добрый Э - Эхsvnvlad,

используй вложенность при написании джойнов:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * 
  FROM t1
    LEFT JOIN t2 
      INNER JOIN t3 
      ON t3.t2_id = t2.id
    ON t2.t1_id = t1.id


чем-то не устроило?
Никогда не встречал такой формулировки. Не успел еще осознать. По сути должно быть так круче.
...
Рейтинг: 0 / 0
06.02.2015, 06:06:45
    #38872960
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
miksoft,

как понимаю ТЕПЕРЬ работает. В 5.1. потребовало бы алиасы для каждой таблички, в т.ч. и для вложенного подзапроса ... вот тебе и скобки. :)
...
Рейтинг: 0 / 0
06.02.2015, 07:51:50
    #38872972
Запрос с LEFT JOIN + INNER JOIN
Arhat109miksoft,

как понимаю ТЕПЕРЬ работает. В 5.1. потребовало бы алиасы для каждой таблички, в т.ч. и для вложенного подзапроса ... вот тебе и скобки. :)в 5.1.61 работает, ничего не требует
...
Рейтинг: 0 / 0
06.02.2015, 08:46:31
    #38872993
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
я вот одного не понял

Т1 - план прибытия автомобилей - arrives
T2 - car_drivers
T3 - cars
T4 - drivers.

вот в упор не понимаю почему 4 таблицы.

если за машиной закреплён водитель один, то Т2 ненужно
если это некая компания, и на каждую поездку(одна запись в прибытие) делается связь водитель-машина, всёравно не понятно зачем Т2

а уж почему Т1 и Т2 связаны, совсем загадка.
...
Рейтинг: 0 / 0
06.02.2015, 10:01:27
    #38873041
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
miksoftДобрый Э - Эх
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * 
  FROM t1
    LEFT JOIN t2 
      INNER JOIN t3 
      ON t3.t2_id = t2.id
   ON t2.t1_id = t1.id

Шайтан! И правда работает!
http://sqlfiddle.com/#!2/2220e/1
Впервые вижу, что два ON последовательно работают.

Но лично я написал бы через два LEFT JOIN-а, потому как в объемных запросах слишком неожиданно встретить два ON подряд, особенно, когда их JOIN на экран выше.


Не, я лично не знал, что можно не ставить скобки.
Ну да, там по синтаксису и так ясно, кто с кем JOIN-иться.
Раньше не задумывался над этим тоже, потому что всегда пишу всё LEFT , если выше уже есть LEFT.
...
Рейтинг: 0 / 0
06.02.2015, 10:02:17
    #38873042
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
svnvladmiksoftНо лично я написал бы через два LEFT JOIN-а, потому как в объемных запросах слишком неожиданно встретить два ON подряд, особенно, когда их JOIN на экран выше.
LEFT JOIN-ы медленней работают, чем INNER JOIN.

Не только медленнее, но и вообще по-другому ...
...
Рейтинг: 0 / 0
06.02.2015, 10:19:21
    #38873070
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
MasterZivНу да, там по синтаксису и так ясно, кто с кем JOIN-иться.
Да, но наличие хотя бы одного LEFT сразу лишает сервер возможности изменить порядок сканирования/связывания таблиц. А в исходном запросе порядок связывания не соответствовал требуемой логике. Так что либо скобки, либо вложенные связывания, либо мой вариант с правым джойном. Ну или совсем отстойный вариант с подзапросом.
...
Рейтинг: 0 / 0
06.02.2015, 10:20:58
    #38873074
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
AkinaMasterZivНу да, там по синтаксису и так ясно, кто с кем JOIN-иться.
Да, но наличие хотя бы одного LEFT сразу лишает сервер возможности изменить порядок сканирования/связывания таблиц. А в исходном запросе порядок связывания не соответствовал требуемой логике. Так что либо скобки, либо вложенные связывания, либо мой вариант с правым джойном. Ну или совсем отстойный вариант с подзапросом.
ваше ничего не понял...
ну да ладно...
...
Рейтинг: 0 / 0
06.02.2015, 10:40:37
    #38873100
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с LEFT JOIN + INNER JOIN
MasterZivРаньше не задумывался над этим тоже, потому что всегда пишу всё LEFT , если выше уже есть LEFT.
Не понял... ты хочешь сказать, что тебе пофиг на то, какая должна быть заложена логика при получении результата? а ведь эта тема - яркий пример того, что бездумное использование LEFT JOIN может дать вовсе не тот результат, который требуется на самом деле.
Пора тебе, наверное, пересматривать свой подход. А то ведь нарвёшься...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с LEFT JOIN + INNER JOIN / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]