Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: запрос с JOIN
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » запрос с JOIN

Страниц (1): [1]
 

1. DlTA - 26 Сентября, 2016 - 16:28:17 - перейти к сообщению
сегодня понял в чем косяк моего запроса
запрос типа

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `id`
  2. FROM
  3.   t1
  4.   JOIN t2 ON t2.p2=t1.p1 AND t2.p3='1'
  5. WHERE
  6.   1
  7.  


я думал что расположение дополнительного условия "AND t2.p3='1'" не важно где быть
сверху или после WHERE
а оказалось что это важно((

судя по всему условие сверху влияет только на ту таблицу в которой это приписано, а если условие вписано уже после WHERE то влияет на весь результат.
2. OrmaJever - 26 Сентября, 2016 - 16:53:31 - перейти к сообщению
но ведь это обычный join, а в нём если в t2 не будет записи, то и из t1 ничего брать не должно Однако
Можно пример результата с двумя вариантами?
3. Мелкий - 26 Сентября, 2016 - 18:26:35 - перейти к сообщению
Проверьте ещё раз, речь об [inner] join либо left join?
4. DlTA - 26 Сентября, 2016 - 23:05:47 - перейти к сообщению
исходный код с left join
код исходный:
Спойлер (Отобразить)


конечный код:
Спойлер (Отобразить)


результаты код:
ID
38322
38324
38525
38526
38527
38528
38529
38530
38531

а должно быть только (конечный):
ID
38324

я долго думал почему у меня в исходном sql лишние поля, в выводе добавил
SELECT DISTINCT `goods`.`id` , `colorGroups`.`id`
и получил
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 38322   NULL
  3. 38324   75
  4. 38525   NULL
  5. 38526   NULL
  6. 38527   NULL
  7. 38528   NULL
  8. 38529   NULL
  9. 38530   NULL
  10. 38531   NULL
  11.  

(Добавление)
а переместив AND `colorGroups`.`id`='75' уже после WHERE получил нормальный результат
5. Мелкий - 27 Сентября, 2016 - 00:24:02 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. LEFT JOIN `colorGroups` /**/
  2. WHERE /**/
  3.         AND `colorGroups`.`id`='75'

Это ошибочный способ написать inner join. Фактически результат идентичен именно inner join'у, но сбивает с толку читателя и, возможно, даже планировщик запроса.

left join в where обязан проверять на null
CODE (SQL):
скопировать код в буфер обмена
  1. LEFT JOIN `colorGroups` /**/
  2. WHERE /**/
  3.         AND (`colorGroups`.`id` IS NULL OR `colorGroups`.`id`='75')

Либо проверяться в условии объединения, что то же самое.

Ну а если и по логике данных нужно получить пересечение множеств, то зачем left join? Всё-таки надо понимать, какие части множеств будут в результате.

 

Powered by ExBB FM 1.0 RC1