select
p.id,
p.author author_id,
p.publish_date,
p.views,
sum(v.value) rating,
count(case when v.value > 0 then 1 end) likes,
count(case when v.value < 0 then 1 end) dislikes,
p.title,
coalesce(p.content_full, p.content_brief) content,
group_concat(distinct td.name) tags,
count(distinct c.id) comments,
u.name author_name
from
posts p
left join tags t on t.post_id = p.id
left join tags_data td on td.id = t.tag_id
left join votes v on v.type = 'article' and v.content_id = p.id
left join comments c on c.post_id = p.id
left join users u on u.id = p.author
where p.id = 4
group by p.id
Имею такой запрос на получение записи и связанных с ней данных — теги, имя автора, количество комментариев и рейтинг. Ок,
count(distinct c.id) comments
позволяет корректно подсчитать комментарии. Буксую с подсчётом рейтинга и кол-ва лайков-дизлайков: они умножаются на количество связанных разделов, и я не знаю как указать их операторам sum и count учитывать только уникальные совпадения так же, как сделал это с подсчётом комментариев.
Вернее, знаю
cast(sum(v.value)/count(v.id)*count(distinct v.id) as signed) rating,
cast(count(case when v.value > 0 then 1 end)/count(v.id)*count(distinct v.id) as unsigned) likes,
cast(count(case when v.value < 0 then 1 end)/count(v.id)*count(distinct v.id) as unsigned) dislikes
, но надеюсь что есть менее костыльный способ.