Mysql Неправильный результат при использовании агрегатной функции

Kompot

Новичок
Здравствуйте. Такая проблема.
Есть таблица со статьями - article
Есть таблица с комментариями - comments
Есть таблица с тегами - tags и промежуточная таблица между article и tags - articles_tags

Задача: запрос на вывод статей с количеством комментариев и тегами.

Проблема:
Следующий запрос ->
SELECT DISTINCT articles.*, COUNT(comments.id) AS comment_count
FROM articles
LEFT JOIN comments ON articles.id = comments.article_id
LEFT JOIN articles_tags ON articles.id = articles_tags.article_id
LEFT JOIN tags ON articles_tags.tag_id = tags.id
GROUP BY articles.id
<- не может правильно сосчитать количество комментариев. Причем косячит с интересной деталью - если тегов 0 или 1 - все правильно считает. Если тегов Х (где Х >1), то количество комментариев будет равно реальное ко-во комментариев * Х. Я так понимаю, что на каждый тег создается свой дубль записи и COUNT проходится по всем ним и суммирует количество комментов у дубля.

Как правильно переписать запрос? Заранее спасибо за помощь.
 

Adelf

Administrator
Команда форума
а зачем вообще тэги в этом запросе?
 

Kompot

Новичок
а зачем вообще тэги в этом запросе?
Эта часть запроса, выделенная из большего запроса сформированного при помощи ActiveRecord Yii2. Подразумевается, что по тегам будет вестись фильтрация. Вот только если фильтрации по тегу нет - выходит такая вот ошибка. А если есть и фильтр добавляется WHERE с ид тега - то все норм.
 

Adelf

Administrator
Команда форума
ну так и джойни теги только когда есть фильтрация по ним...
 

Kompot

Новичок
ну так и джойни теги только когда есть фильтрация по ним...
Это не вариант в моем случае. Хорошо, а как написать соотнесенный подзапрос в SELECT? Хочу что-то типа
SELECT DISTINCT articles.*, (SELECT COUNT(*) FROM comments WHERE article_id = текущему ид статьи) AS comment_count
FROM articles
LEFT JOIN comments ON articles.id = comments.article_id
LEFT JOIN articles_tags ON articles.id = articles_tags.article_id
LEFT JOIN tags ON articles_tags.tag_id = tags.id
GROUP BY articles.id
 

Kompot

Новичок
Все, подзапрос сам написал, вот только гад не хочет в Yii2 работать.
 

Adelf

Administrator
Команда форума
@Kompot, а тебе тут ORM не нужен.
можно делать raw sql запрос и сделать свою,так называемую read model. Article. со всей нужной инфой...комменты и т.д. и заполнять ее из данных от запроса. сохранять эту модель тебе не надо будет никогда. поэтому она будет очень простой. я постоянно юзаю рид модели в проектах...
 
Сверху