Подсчет в базе данных mysql - PullRequest
0 голосов
/ 10 февраля 2020

Это мой запрос

Select articles.id,articles.userid,articles.article,count(articles_likes.id), count(article_dislikes.id) 
from articles
Left join article_likes 
on article_likes.article_id=articles.id 
Left join article_dislikes 
on article_dislikes.article_id=articles.id 
group by articles.id ;

Я хочу подсчитать количество строк в таблицах article_likes и table article_dislikes, получая корректное значение до 2 строк. Когда есть третьи и так далее записи. Я получаю неправильный подсчет строк. Я не знаю, где проблема. Я думаю, что я могу получить неправильные значения, потому что я использую одну и ту же таблицу два раза.

У меня есть три таблицы

1) статьи содержат идентификатор, идентификатор пользователя и статью
2) Таблица Articles_likes содержит-like_id, user_id и article_id
3) Таблица Articles_dislikes содержит dislike_id, user_id и article_id

1 Ответ

0 голосов
/ 10 февраля 2020

Ваши объединения объединяют все подобные статьи с каждой неприязнью к одной и той же статье. В результате вы получаете произведение двух пунктов. Таким образом, если статья имеет 3 лайка и 2 антипатии, объединения сгенерируют 6 строк, и вы получите 6 как результат для обоих подсчетов. Вы можете обойти это с COUNT(DISTINCT ..), но если у вас много симпатий и антипатий, у вас могут возникнуть проблемы с производительностью. Таким образом, следует избегать этих объединений и либо выполнять предварительную агрегацию в подзапросах в предложении FROM, либо использовать коррелированные подзапросы в предложении SELECT, как показано здесь:

select
  articles.id,
  articles.userid,
  articles.article, 
  (
    select count(*)
    from article_likes
    where article_likes.article_id = articles.id
  ) as likes_count,
  (
    select count(*)
    from article_dislikes
    where article_dislikes.article_id = articles.id
  ) as dislikes_count
from articles
...