Странный косяк с запросом.

rusan

Новичок
Странный косяк с запросом.

Есть запрос

SELECT kb.id, COUNT(kbd.id) AS numkom FROM kom_blog kb LEFT JOIN kom_blog_discussion kbd ON kbd.visibility='y' AND kb.id=kbd.blog_id WHERE kb.visibility='y' GROUP BY kbd.blog_id ORDER BY kb.timepublish DESC;

который как видно выбирает id сообщения и количество комментариев к нему.
выдает такой вот ответ
+----+--------+
| id | numkom |
+----+--------+
| 10 | 3 |
| 4 | 0 |
+----+--------+

Но стоит написать

SELECT kb.id, COUNT(kbd.id) AS numkom FROM kom_blog kb LEFT JOIN kom_blog_discussion kbd ON kbd.visibility='y' AND kb.id=kbd.blog_id WHERE kb.visibility='y' AND kb.id=9 GROUP BY kbd.blog_id ORDER BY kb.timepublish DESC;
как он нормально выдает эту 9
+----+--------+
| id | numkom |
+----+--------+
| 9 | 0 |
+----+--------+
по timepublish порядок такой 10,9,4
 

.des.

Поставил пиво кому надо ;-)
hint: существуют теги [php ] [/php ] (без пробелов.)
Вообще это элементарное уважение к другим участникам!

при помощи этих двух простых тегов ты можешь резко увеличить количество желающих помочь тебе.
запросы можно переписать например так:
PHP:
SELECT kb.id,  COUNT(kbd.id) AS numkom 
FROM 
   kom_blog kb LEFT JOIN kom_blog_discussion kbd ON
   kbd.visibility='y' AND kb.id=kbd.blog_id 
WHERE kb.visibility='y' 
GROUP BY kbd.blog_id 
ORDER BY kb.timepublish DESC;
PHP:
SELECT kb.id, COUNT(kbd.id) AS numkom 
FROM 
   kom_blog kb LEFT JOIN kom_blog_discussion kbd ON
   kbd.visibility='y' AND kb.id=kbd.blog_id 
WHERE kb.visibility='y' AND kb.id=9 
GROUP BY kbd.blog_id 
ORDER BY kb.timepublish DESC;

А еще.. читаем мануал
You should generally not have any conditions in the ON part that are used to restrict which rows you have in the result set (there are exceptions to this rule). If you want to restrict which rows should be in the result, you have to do this in the WHERE clause.
На русском :)
http://www.mysql.com/doc/ru/JOIN.html
 

rusan

Новичок
Извините, за то что не красиво написал. Спасибо, что показали как это можно делать.

Прочитав manual нар на 10 я так ничего не понял. Отчего же в первом случае, у 4-го сообщения нет комментариев и оно в общей выборке выводится, а 9-е, которое по ОРДЕРУ долдна вывести раньше не выводится...
 

.des.

Поставил пиво кому надо ;-)
Я же привел ссылку на русский мануал
Никогда не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов. Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE.
Для начала выполните это требование.
 

rusan

Новичок
я понимаю и по русски и по английски... Но запрос вида
PHP:
SELECT kb.id,  COUNT(kbd.id) AS numkom 
FROM 
   kom_blog kb LEFT JOIN kom_blog_discussion kbd ON 
   1=1 
WHERE kb.visibility='y' AND kbd.visibility='y' AND kb.id=kbd.blog_id
GROUP BY kbd.blog_id 
ORDER BY kb.timepublish DESC;
Он выберет (да я проверил и это и так видно без мануала) меньше рядов и он вообще не выберет тех сообщений у которых нет комментария. И странный это мануал...
 

Апельсин

Оранжевое создание
Вообще-то по стандарту оба запроса должны выдавать один и тот же результат, но как сказал des - читай мануал. В MySQLе условия фильтрации записей действительно надо ставить в WHERE.
 

rusan

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

Апельсин

Оранжевое создание
rusan, я имелла ввиду, что если ты напишешь запросы вида
... tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id AND some_column=some_value

и

tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id WHERE some_column=some_value

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

rusan

Новичок
А я что выше написал? Что я все переставил!

Хорошо... Предположим я вообще туп и нифга не смыслю в написании sql запросов, кто мне объяснит как написать элементарный запрос
есть таблица состоящая из id (интегер, нот нулл, примари кей, автоинкремент), вторая таблица состоящая из одного поля first_id (интегер)
надо сделать запрос который покажет все(!!! все!!!) ID из первой и сколько раз такое же число содержиться во второй таблице.
Я всегда думал, что это запрос вида
PHP:
SELECT f.*, count(s.*)
FROM first_table f
LEFT JOIN second_table s
ON f.id=s.first_id
GROUP BY s.first_id
Что не так?
 

.des.

Поставил пиво кому надо ;-)
PHP:
SELECT f.*, count(s.id) 
FROM f LEFT JOIN s ON f.id=s.first_id  
GROUP BY f.id;
 

rusan

Новичок
странно... складываешь вроде во второй таблице, а группируешь первую... это я так...
 

rusan

Новичок
спасибо
.des. с тебя адрес инет-магазина, который доставкой по вашему городу занимается и карочки к оплате принимает, с меня пиво.
 
Сверху