Помогите составить SQL-запрос

M
На сайте с 16.10.2006
Offline
69
698

Есть таблица с новостями, таблица с пользователями (кто добавил новость?) и комментариями (сколько комментов у этой новости?). Необходимо выбрать все новости с именем пользователя и кол-вом комментов.

SELECT news.*, users.name, news_comments.*

FROM users, news
LEFT OUTER JOIN news_comments
ON news.news_id = news_comments.comment_item_id
WHERE news.news_user = users.id
ORDER BY news.news_id DESC

Таким джоином объединил таблицы, чтобы даже если записей в правой таблице нет, выводились нуллы.

Добавляем груп бай и каунт

SELECT news.*, users.name, COUNT(news_comments.*)

FROM users, news
LEFT OUTER JOIN news_comments
ON news.news_id = news_comments.comment_item_id
WHERE news.news_user = users.id
GROUP BY news_comments.comment_item_id
ORDER BY news.news_id DESC

check the manual that corresponds to your MySQL server version for the right syntax to use near '*)

:(

[umka]
На сайте с 25.05.2008
Offline
456
#1

SELECT news.*, users.name, COUNT(*) comment_count FROM users, news, news_comments WHERE news.news_user = users.id AND news_comments.comment_item_id=news.news_id GROUP BY news.news_id ORDER BY news.news_id DESC

JOIN-ы — зло!

Что бы вам там ни казалось, в подавляющем большинстве случаев можно обойтись без join-ов.

В основном, join-ы применяются когда нужно выбрать из одной таблицы элементы, которых нет в другой таблице.

Лог в помощь!
N
На сайте с 06.05.2007
Offline
419
#2

[umka], тем не менее по смыслу запроса вы тоже сделали join, хотя может и не знаете об этом :)

или вы просто противник самого этого слова? OUTER JOIN действительно не нужен. Cамо по себе применение JOIN просто вопрос вкуса. Некоторым нравится явное указание соединяемых полей в операторе ON.

вот применение LEFT OUTER JOIN именно такой последовательности букв по неизвестной, но интересной мне причине, многие - уже 6 человек вместе ТС, считают единственным способом объединения информации.

maxtat, что вы читали по SQL ?

Кнопка вызова админа ()
Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#3
'[umka:
;6792460']

JOIN-ы — зло!
Что бы вам там ни казалось, в подавляющем большинстве случаев можно обойтись без join-ов.
В основном, join-ы применяются когда нужно выбрать из одной таблицы элементы, которых нет в другой таблице.

Сами по себе JOINы зло или они зло в кривых руках? 🙄

M
На сайте с 16.10.2006
Offline
69
#4

[umka] то что вы написали, это тоже джоин (inner join), только без использования слова джоин :) смысл один и тот же

Иннер джоин мне не подходит, ибо если отсутствует запись в правой таблице, то и из левой тоже ничего не выберется.

[umka]
На сайте с 25.05.2008
Offline
456
#5

А, блин, товарищу надо выбирать новости даже если нет камментов...

тогда с join-ом :)

SELECT news.*, users.name, COUNT(news_comments.comment_id) comment_count FROM users, news LEFT JOIN news_comments ON (news_comments.comment_item_id=news.news_id OR news_comments.comment_item_id IS NULL) AND users.id = news.news_user GROUP BY news.news_id ORDER BY news.news_id DESC

[umka] добавил 24.04.2010 в 00:55

Алексей Барыкин:
Сами по себе JOINы зло или они зло в кривых руках? 🙄

LEFT JOIN-ы сами по себе ))

а уж в кривых руках — так особенно! :D

N
На сайте с 06.05.2007
Offline
419
#6

ok, 5 человек.

maxtat, так не пишут. замените на count(news_comments.comment_item_id).

M
На сайте с 16.10.2006
Offline
69
#7

Спасибо! Все выводит как надо

SELECT news.*, users.name, COUNT(news_comments.comment_id) comment_count

FROM users, news
LEFT JOIN news_comments
ON news_comments.comment_item_id=news.news_id OR news_comments.comment_item_id IS NULL
WHERE users.id = news.news_user GROUP BY news.news_id ORDER BY news.news_id DESC
Dreammaker
На сайте с 20.04.2006
Offline
569
#8
[umka:
]LEFT JOIN-ы сами по себе ))

А RiGHT JOIN-ы значит меньшее зло? :)

Станислав
На сайте с 27.12.2009
Offline
258
#9
Dreammaker:
А RiGHT JOIN-ы значит меньшее зло? :)

😂

Лишние запросы это уже зло.

Мы там, где рады нас видеть.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий