【问题标题】:Counting in mysql database在mysql数据库中计数
【发布时间】:2020-02-10 08:51:53
【问题描述】:

这是我的查询

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 表和 article_dislikes 表中的行数,我得到正确的值最多 2 行。当有第三个等条目时。我的行数计数错误。 我不知道问题出在哪里。我认为我可能会得到错误的值,因为我使用同一个表两次。

我有三张桌子

1)articles 包含 id、userid 和 article
2)Articles_likes 表包含-like_id ,user_id 和 article_id
3)Articles_dislikes 表包含 dislike_id ,user_id 和 article_id

【问题讨论】:

  • 不是“加入然后计数”,而是“在子查询中计数然后加入”。作为一种缓解措施 - COUNT(DISTINCT tableX.fieldY) - 但这仅适用于 tableX 中的 fieldY 定义为 UNIQUE。
  • count(articles_likes.id) 这是一个错字 - 调用的表称为 article_likes? AND id 在join中被称为article_id?

标签: mysql database count


【解决方案1】:

您的加入将文章的每一个喜欢与同一篇文章的每一个不喜欢结合起来。结果,您得到了两个计数的乘积。因此,如果一篇文章有​​ 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

【讨论】:

  • @Strawberry 你有我的测试数据吗?如果你发现了一个错误,为什么不直接告诉我,这样我就可以修复它。只是那个逗号吗?
  • 是的 - 我没有任何测试数据,所以我无法评论其他错误。
  • Paul Spiegal 感谢人..这个帮助了我。首先,我应该使用子查询而不是使用连接。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多