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 :: LEFT JOIN и COUNT [2]

 PHP.SU

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


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

> Без описания
Champion Супермодератор
Отправлено: 15 Октября, 2011 - 18:47:12
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Для такого дампа если убрать AND ca.id = 0, то будет семерка возле русского)
(Добавление)
Но вы говорили, что нужны записи с id = 0 (которых нету). Потому запрос и возвращал нули
(Добавление)
Только в первом запросе в выражении ON к нулю приравнивался category_id, а я приравнял ca.id. Нужно написать ca.category_id. Но тогда будет не 7, а 2
 
 Top
White
Отправлено: 15 Октября, 2011 - 18:53:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


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




Champion ну скажем не проблема, а скорее особенность архитектуры системы. если использовать GROUP_CONCAT(`categories_content`) в вашем запросе, можно увидеть то о чем я говорю.


-----
if(time()>1356048000) die();
 
 Top
Champion Супермодератор
Отправлено: 15 Октября, 2011 - 18:59:44
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




White пишет:
если использовать GROUP_CONCAT(`categories_content`) в вашем запросе, можно увидеть то о чем я говорю.
Если это использовать, получается ошибка, что нет такого поля. Если указать какое-нибудь другое поле, то то,что я увидел ничего нового мне не говорит.
Я увидел NULL для той строки, для которой count() вернул 0 и я увидел список из N айдишек для той строки, для которой count вернул N - всё хорошо получается
 
 Top
White
Отправлено: 15 Октября, 2011 - 19:28:38
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


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




Champion и что при этом посчитал count()? количество присоединенных строк из таблицы справа.
я не спорю, что это правильный результат, но наименее ожидаемый теми кто не часто использует JOIN. автор этого топика вероятно тоже ожидал увидеть там количество строк в правой таблице соответствующих условию WHERE categories_content.category_id = 0 (даже если бы их было не 0)


-----
if(time()>1356048000) die();
 
 Top
Champion Супермодератор
Отправлено: 15 Октября, 2011 - 19:36:15
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




White пишет:
это правильный результат, но наименее ожидаемый теми кто не часто использует JOIN
Ну я примерно это и сказал: проблема в том, что люди смутно представляют суть внешних join-ов.
Однако, мы поняли, что count посчитал всё правильно, а значит отказались от
White пишет:
без подзапроса она не решается.


White пишет:
автор этого топика вероятно тоже ожидал увидеть там количество строк в правой таблице соответствующих условию WHERE categories_content.category_id = 0 (даже если бы их было не 0)
Автор этого топика переставил местами левую и правую таблицу (или использовал left join вместо right) - это была первая ошибка.
Вторая ошибка была в том, что услови, которое должно быть в ON было написано в WHERE.
Решены ли все - мы пока не поняли, пока автор не отписался
 
 Top
puta
Отправлено: 15 Октября, 2011 - 21:31:56
Post Id


Новичок


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


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




Спасибо, вот теперь, проблема решена. Ошибку осознал ) Единственное в чём остался вопрос - разница в использовании ON и s WHERE в данном конкретном случае?

Может кому-то пригодится финальный запрос )

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT ca.id) AS `count`, la.title,la.alias,la.id
  2. FROM `languages` la
  3. LEFT JOIN `categories_content`ca ON ca.LANGUAGE = la.alias AND ca.category_id = 0
  4. GROUP BY la.alias
  5. ORDER BY la.alias
 
 Top
Champion Супермодератор
Отправлено: 15 Октября, 2011 - 21:41:54
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




puta пишет:
Единственное в чём остался вопрос - разница в использовании ON и s WHERE в данном конкретном случае?
Разница в том же, в чем и в любом другом случае.
Если вы пишете в WHERE сравнения с полями из той таблицы, которая приджойнивается внешним соединением, то запрос превращается во внутреннее соединение.
Перепишите свой запрос без группировки и без подсчета количества. И мой запрос тоже. И сравните результат.
У меня будет что-то типа
l.id....|....r.id....|....r.txt
-------|----------|--------
1.......|....1.......|.......str1
1...... |....1.......|....... str2
2.......|...NULL...|....NULL

У вас то же, только без последней строки. Потому что в where происходило сравнение с NULL значений из правой таблицы и они отбрасывались. А нам надо, чтобы если соотв.значения нет, то строка возвращалась, но с пустой правой часть - поэтому условие надо писать в ON.
 
 Top
puta
Отправлено: 15 Октября, 2011 - 21:48:42
Post Id


Новичок


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


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




Champion, спасибо большое за помощь и подробное разъяснение )
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB