Задать вопрос
@Vadim1899

Правильный COUNT в SQL запросе?

Всем привет!
Запрос к бд формируется таким образом:

$database = Database::openConnection();
       $query  = "SELECT posts.id AS id, users.profile_picture, users.id AS user_id, users.name AS user_name, posts.title, posts.content, posts.date, COUNT(*) AS comments ";
       $query .= "FROM users, posts, comments ";
       $query .= "WHERE posts.id = :id ";
       $query .= "AND users.id = posts.user_id LIMIT 1 ";


COUNT(*) AS comments выводит кол-во записей в таблице comments, а как сделать так, чтобы выводилось кол-во комментариев where post_id = :post_id? Не совсем понимаю

Пробовал так:
$database = Database::openConnection();
       $query  = "SELECT posts.id AS id, users.profile_picture, users.id AS user_id, users.name AS user_name, posts.title, posts.content, posts.date, COUNT(*) AS comments ";
       $query .= "FROM users, posts, comments ";
       $query .= "WHERE posts.id = :id ";
       $query .= "AND comments  = :post_id ";
       $query .= "AND users.id = posts.user_id LIMIT 1 ";

       .....
      $database->bindValue(':post_id ', $post_id );


Но выдает ошибку.
И такой вопрос: не сильная ли будет нагрузка на бд? При каждом открытии поста в блоге, каждый раз будет отборка count по всей таблице с комментариями
  • Вопрос задан
  • 144 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@ponaehal
Count - групповая функция. Что бы запрос с Count работал, необходимо выполнение одного из следующих условий:
1. Count - только одно поле в списке выбора. T.е. SELECT count(*) from ...
2. Проведена группировка по всем атрибутам в списке выбора. SELECT fio, bdate, count(*) from tab group by fio,bdate.
Второй случай похоже покрывает ваши потребности.

На Вашем есте я бы еще посмотрел на аналитические функции COUNT(..) OVER (PARTITION BY ... ) имхо работать будет быстрее чем COUNT(..) GROUP BY..., но не понимая задачи не знаю насколько можно использовать в Вашем случае
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы