За последние 24 часа нас посетили 97119 программистов и 2676 роботов. Сейчас ищут 1535 программистов ...

Подсчет комментов

Тема в разделе "PHP для новичков", создана пользователем Nikolai_, 2 дек 2012.

  1. Nikolai_

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

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Возникла такая задача. Есть таблица со статьями (articles) и таблица с комментами с ней (comments). Необходимо вывести заголовки статей и в скобках количество комментов к каждой статье. Как это можно оптимально сделать? Может добавить в таблицу articles дополнительное поле number_comments, где будет количество комментов к каждой статье? Или каким-то образом можно нетрудоемко считать на лету при выводе это число комментов для статей?
     
  2. Stedex

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

    С нами с:
    30 ноя 2012
    Сообщения:
    8
    Симпатии:
    0
    SQL count where
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    можно и так и так.
    есил ожидается посетителей мало - то считайте налету.
    если нагрузка будет большая то сделайте отдельное поле, но тогда при любом изменении кол-ва комментов надо незабывать обновлять его. или написать триггер
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    Конечно поле-счетчик. Это самое простое решение и базу не напрягает.
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    да. только надо незабывать обновлять его когда:
    добавляют новые комменты, редактируют старые(меняют видимость), удаляют. когда это делают пользователи, или в админке. еще когда это делается через ajax каким нибудь плагином... и т.д.
    хорошо когда эти манипуляции описаны в одном файле или классе)
     
  6. Nikolai_

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

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Понял, сделаю поле-счетчик.

    Добавлено спустя 3 минуты 57 секунд:
    А как вообще это делается? Можно пример для наглядности?

    Например, есть таблицы articles (поля: id_article, title, text) и comments (поля: id_comment, id_article, text). Как должен выглядеть запрос для вывода заголовков статей и кол-ва комментов к ним?
     
  7. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ну ты когда в БД пишешь сам коммент, пишешь id новости, к которой этот коммент, ну вот и в этой новости делаешь столбец count и "плюсадинишь" его при добавлении нового коммента и "минусодинишь" при удалении.
     
  8. Nikolai_

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

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Не, я имел ввиду как на лету считать. Про поле-счетчик и ежу понятно как сделать.
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    SELECT A.id_article, count(C.id_article) cnt
    FROM articles A
    LEFT JOIN comments C ON C.id_article=A.id_article
    GROUP BY A.id_article
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    дык, к этому надо стремиться )
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Код (Text):
    1. SELECT
    2.     `articles`.*, IF(`id_comment` IS NULL, 0, COUNT(*)) AS `comments_count`
    3. FROM
    4.     `articles`
    5.     LEFT JOIN `comments` USING(`id_article`)
    6. GROUP BY
    7.     `articles`.`id_article`;
     
  12. Nikolai_

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

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    А какой вариант из этих предпочтительней?
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вариант от sobachnik бери. он аккуратнее
     
  14. Nikolai_

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

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Всем, кто помог - спасибо - все получилось