mysql - SQL 查询返回 Sum 和 Count 的错误值

标签 mysql sql

My SQL 查询包含三个表:posts 表、post_likes 表和 comments 表。 所有表都与 posts 表中的 post_id 主键连接。我试图返回帖子行的内容以及 post_likes 表中喜欢/不喜欢的数量以及评论的数量。该查询工作正常,直到我引入第二个左连接,它现在显示 like_count 列 x5 dislike_count 列 x5 和新的 comment_count x4。

这是有问题的查询:

SELECT c.post_id, c.post_name, c.post_content, c.post_datetime, c.user_name, sum(p.like_count) AS like_count, sum(p.dislike_count) AS dislike_count, sum(s.comment_count) AS comment_count FROM posts c LEFT JOIN post_likes p ON c.post_id = p.post_id LEFT JOIN comments s ON c.post_id = s.post_id WHERE c.user_name = 'test' GROUP BY c.post_id

正在返回总和值:

//column | returned value | expected value

    like_count | 10 | 2
    dislike_count | 5 | 1
    comment_count | 20 | 5

一些附加说明,喜欢/不喜欢的内容存储在具有结构的 poSTLikes 表中。

post_like_id, like_count, dislike_count, post_id, user_name

每一列中的喜欢或不喜欢计数只能为 1,PHP 会处理此问题以确保用户不能多次喜欢等,而 user_name 列是喜欢该帖子的用户。

评论表结构如下:

comment_id, comment_name, comment_content, comment_datetime, comment_count, post_id, user_name

插入时comment_count始终为1以允许求和函数,post_id是评论帖子的id,user_name是评论的用户。

最佳答案

您的连接正在生成笛卡尔积——而是将聚合结果移动到子查询中:

SELECT c.post_id, c.post_name, c.post_content, c.post_datetime, c.user_name, 
    p.like_count, 
    p.dislike_count, 
    s.comment_count
FROM posts c 
    LEFT JOIN (
       select post_id, 
              sum(like_count) like_count,
              sum(dislike_count) dislike_count
       from post_likes
       group by post_id
    ) p ON c.post_id = p.post_id 
    LEFT JOIN (
       select post_id, sum(comment_count) comment_count
       from comments
       group by post_id
    ) s ON c.post_id = s.post_id 
WHERE c.user_name = 'test' 

关于mysql - SQL 查询返回 Sum 和 Count 的错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33381905/

相关文章:

c# - 查询显示 +- 2 天的数据,但仅返回选定的日期本身

mysql - SQL查询和计算;正确格式化查询以仅选择 id

php - 仅使用 PHP 对搜索结果进行分页

c++ - 使用 C++ 的 MySQL 事务?

mysql - SQL : "NOT IN" subquery optimization or alternatives

sql - MySQL 嵌套集 - 如何查找节点的父节点?

sql - 填补数据空白 - UNION、PARTITION BY 还是 JOIN?

sql - 如何在 “sqoop export”中使用组合键来更新记录?

mysql - 将数据库导入到 ms sql server

mysql - 如何在 MySQL 中插入括号和斜杠