За последние 24 часа нас посетили 36588 программистов и 1719 роботов. Сейчас ищут 823 программиста ...

Какой запрос для просчета комментариев?

Тема в разделе "PHP для новичков", создана пользователем igortik, 29 июн 2009.

  1. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    Приветствую!

    Не могу понять как построить запрос для получения рейтинга статей по количеству комментариев.

    Условие:

    1. Статьи пишутся в отдельную таблицу (в ней нет учета комментариев)
    2. Комментарии во второй таблице (существует поле id, parent_id (указывает на родительский элемент), comment)

    P.S. Очень прошу не кидаться линками, катастрофически нет времени читать с нуля, т.к. и так немного в срок не укладываюсь да еще и в mysql плаваю ...
     
  2. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Код (Text):
    1. SELECT art.*, COUNT(cmnt.id) AS count_reply FROM `articles` art
    2. LEFT JOIN `comments` cmnt ON cmnt.article_id=art.article_id
    3. GROUP BY article_id ORDER BY count_reply DESC
     
  3. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    Очень благодарен, если действительно сработает!!!

    Буду проверять в ближайшее время!!!

    спасибо!!
     
  4. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    Пардон, не в ту ветку вопрос задал :(

    Еще не освоился у Вас!
     
  5. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    Прежде чем совать решение готовое, хотелось бы разобраться...

    Что в данном случае:

    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. чем дальше в лес - тем больше дров...
     
  6. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    В общем-то, таблица комментариев:

    users_comments
    id | user_id | parent_id | comment

    user_id - id пользователя, оставившего комментарий
    parent_id - id статьи, к которой принадлежит запись
    comment - сам комментарий

    Статьи:

    articles
    id | name | html

    Пожалуй, другие поля опущу.

    На выходе хочется нечто:

    articles.id | articles.name | (кол-во комментариев к статье)

    вывод по возрастанию / убыванию (DESC /)
     
  7. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    igortik, рекомендую сделать дополнительное поле в статье с названием commentsCount, которое увеличивать каждый клик. Это называется денормализация, обычно так и делается (например на форумах phpbb), и оно будет быстрее в итоге, чем JOIN с COUNT'ом.
     
  8. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    TheShock
    Я полностью с тобой согласен!

    Это мое запасное решение, если не найду более сложного.
    Мне раз плюнуть поставить поле и update `tabe` set `count`=`count`+1 но хочется уже ближе подбираться к мускулу
     
  9. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    Парни,
    прошу помощи с запросом...

    в мускуле плаваю конкретно, сроки по проекту жмут, но не хочу делать методом добавления поля в таблицу!!!



    В общем-то, таблица комментариев:

    users_comments
    id | user_id | parent_id | comment

    user_id - id пользователя, оставившего комментарий
    parent_id - id статьи, к которой принадлежит запись
    comment - сам комментарий

    Статьи:

    articles
    id | name | html

    Пожалуй, другие поля опущу.

    На выходе хочется нечто:

    articles.id | articles.name | (кол-во комментариев к статье)

    вывод по возрастанию / убыванию (DESC /)
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Так ведь код в первом комментарии вроде делает то, что надо...
     
  11. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    Volt(220)
    Я уверен, что он сделает то что надо, если поменять в нем названия таблиц и полей на мои, но здесь я полный даун.
    mysql у меня на уровне селектов, инсертов, делетов и ... достижение .. inner join

    так что пока заклинание не помогло, прошу помощи!
     
  12. igortik

    igortik Активный пользователь

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    Ок, я включил мозг и понял, что такое 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]
     
  13. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    [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 по убыванию.