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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: запрос с JOIN

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: не думал что будет косяк.
DlTA
Отправлено: 26 Сентября, 2016 - 16:28:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




сегодня понял в чем косяк моего запроса
запрос типа

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 то влияет на весь результат.
 
 Top
OrmaJever
Отправлено: 26 Сентября, 2016 - 16:53:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




но ведь это обычный join, а в нём если в t2 не будет записи, то и из t1 ничего брать не должно Однако
Можно пример результата с двумя вариантами?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 26 Сентября, 2016 - 18:26:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Проверьте ещё раз, речь об [inner] join либо left join?


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 26 Сентября, 2016 - 23:05:47
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




исходный код с 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 получил нормальный результат

(Отредактировано автором: 26 Сентября, 2016 - 23:09:29)

 
 Top
Мелкий Супермодератор
Отправлено: 27 Сентября, 2016 - 00:24:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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? Всё-таки надо понимать, какие части множеств будут в результате.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB