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

  • Автор темы Автор темы rusan
  • Дата начала Дата начала

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

Прочитав manual нар на 10 я так ничего не понял. Отчего же в первом случае, у 4-го сообщения нет комментариев и оно в общей выборке выводится, а 9-е, которое по ОРДЕРУ долдна вывести раньше не выводится...
 
Я же привел ссылку на русский мануал
Никогда не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов. Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE.
Для начала выполните это требование.
 
я понимаю и по русски и по английски... Но запрос вида
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, я имелла ввиду, что если ты напишешь запросы вида
... 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, а потом говори что у тебя не так.
 
А я что выше написал? Что я все переставил!

Хорошо... Предположим я вообще туп и нифга не смыслю в написании 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

Что не так?
 
PHP:
SELECT f.*, count(s.id) 
FROM f LEFT JOIN s ON f.id=s.first_id  
GROUP BY f.id;
 
странно... складываешь вроде во второй таблице, а группируешь первую... это я так...
 
спасибо
.des. с тебя адрес инет-магазина, который доставкой по вашему городу занимается и карочки к оплате принимает, с меня пиво.
 
Сверху