Приветствую! Не могу понять как построить запрос для получения рейтинга статей по количеству комментариев. Условие: 1. Статьи пишутся в отдельную таблицу (в ней нет учета комментариев) 2. Комментарии во второй таблице (существует поле id, parent_id (указывает на родительский элемент), comment) P.S. Очень прошу не кидаться линками, катастрофически нет времени читать с нуля, т.к. и так немного в срок не укладываюсь да еще и в mysql плаваю ...
Код (Text): SELECT art.*, COUNT(cmnt.id) AS count_reply FROM `articles` art LEFT JOIN `comments` cmnt ON cmnt.article_id=art.article_id GROUP BY article_id ORDER BY count_reply DESC
Прежде чем совать решение готовое, хотелось бы разобраться... Что в данном случае: art.* - - пока что не ясно cmnt.id - у меня это users_comments.id count_reply - пока что не ясно comments - ьаблица с комментариями, у меня users_comments cmnt - тоже не ясно, предполагаю, что комментарий (users_comments.comment) (?) cmnt.article_id - cmnt.id статьи art.article_id - art.id статьи p.s. чем дальше в лес - тем больше дров...
В общем-то, таблица комментариев: users_comments id | user_id | parent_id | comment user_id - id пользователя, оставившего комментарий parent_id - id статьи, к которой принадлежит запись comment - сам комментарий Статьи: articles id | name | html Пожалуй, другие поля опущу. На выходе хочется нечто: articles.id | articles.name | (кол-во комментариев к статье) вывод по возрастанию / убыванию (DESC /)
igortik, рекомендую сделать дополнительное поле в статье с названием commentsCount, которое увеличивать каждый клик. Это называется денормализация, обычно так и делается (например на форумах phpbb), и оно будет быстрее в итоге, чем JOIN с COUNT'ом.
TheShock Я полностью с тобой согласен! Это мое запасное решение, если не найду более сложного. Мне раз плюнуть поставить поле и update `tabe` set `count`=`count`+1 но хочется уже ближе подбираться к мускулу
Парни, прошу помощи с запросом... в мускуле плаваю конкретно, сроки по проекту жмут, но не хочу делать методом добавления поля в таблицу!!! В общем-то, таблица комментариев: users_comments id | user_id | parent_id | comment user_id - id пользователя, оставившего комментарий parent_id - id статьи, к которой принадлежит запись comment - сам комментарий Статьи: articles id | name | html Пожалуй, другие поля опущу. На выходе хочется нечто: articles.id | articles.name | (кол-во комментариев к статье) вывод по возрастанию / убыванию (DESC /)
Volt(220) Я уверен, что он сделает то что надо, если поменять в нем названия таблиц и полей на мои, но здесь я полный даун. mysql у меня на уровне селектов, инсертов, делетов и ... достижение .. inner join так что пока заклинание не помогло, прошу помощи!
Ок, я включил мозг и понял, что такое cmnt и art [sql] SELECT art.*, COUNT(cmnt.id) AS count_reply FROM `articles` art LEFT JOIN `users_comments` cmnt ON cmnt.parent_id=art.id GROUP BY id ORDER BY count_reply DESC [/sql]
[sql]SELECT -- Выбрать, art.*, -- все поля из таблицы art, COUNT(cmnt.id) -- посчитать количество cmnt.id AS count_reply -- и обозвать результат count_reply, FROM `articles` -- из таблицы articles. art -- Обозвать ее art. LEFT JOIN -- Присоединить к этой таблице `users_comments` -- таблицу users_comments, cmnt -- обозвать ее cmnt. ON cmnt.parent_id=art.id -- Соединить те строки где верно выражение cmnt.parent_id=art.id. -- Остальные строки из первой таблицы включить в результат (для них count_reply = null), остальные строки из второй таблицы не включать в результат (об этом говорит LEFT JOIN). GROUP BY id -- Сгруппировать по id (думаю здесь должно быть art.id, а то есть два поля id в таблице art и в таблице cmnt), группировка нужна чтобы SQL сервер понял как ему считать COUNT(cmnt.id). ORDER BY count_reply -- Упорядочить по полю count_reply DESC -- по убыванию.[/sql] Итого: Выбрать, все поля из таблицы art, посчитать количество cmnt.id и обозвать результат count_reply, из таблицы articles, обозвать ее art. Присоединить к этой таблице таблицу users_comments, обозвать ее cmnt. Соединить те строки где верно выражение cmnt.parent_id=art.id. Остальные строки из первой таблицы включить в результат, остальные строки из второй таблицы не включать в результат. Сгруппировать по id. Упорядочить по полю count_reply по убыванию.