Задать вопрос
Anubis
@Anubis
Люблю корейскую кухню и веб-разработку

Как указать операторам sum и count считать только уникальные вхождения?

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

, но надеюсь что есть менее костыльный способ.
  • Вопрос задан
  • 145 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Azperin
Дилетант
Я не помню можно ли 2 джоина делать на одну и туже таблицу

LEFT JOIN `votes` AS v ON  (v.`type` = 'article' AND v.`content_id` = p.`id` AND v.`value` < 1);
LEFT JOIN `votes` AS z ON  (z.`type` = 'article' AND z.`content_id` = p.`id` AND z.`value` > 0);

Ну и соответствующие каунты по ним

Покажи таблицу лайков
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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