MySQL添加第四个表来选择会弄乱结果

MySQL添加第四个表来选择会弄乱结果,mysql,sql,join,count,Mysql,Sql,Join,Count,我从来没有加入过三联,我的SQL很差,我搞砸了一些事情 Tables: article - id(pk), publicist_id(fk - publicist.id), title, synopsys, text, status ... publicist - id(pk), name ... + stuff that doesn't matter rating - id(pk), article_id(fk - article.id), article_ra

我从来没有加入过三联,我的SQL很差,我搞砸了一些事情

Tables:

article - 
   id(pk), publicist_id(fk - publicist.id), title, synopsys, text, status ...

publicist - 
   id(pk), name ... + stuff that doesn't matter 

rating - 
   id(pk), article_id(fk - article.id), article_rating 

(and later on) comment - 
   id(pk), author, text, article_id(fk - article.id), status ... 
状态只是一个很小的提示,看看它是否处于活动状态

到目前为止,我正在使用这篇文章(文章、公关、评级):

它可以很好地显示文章的标题、大纲、名称、平均评分(2位小数)和评分数

现在,我还必须包括每篇文章的评论数量,我就是无法管理。
以下是我尝试过的:

SELECT a.id, 
a.title, 
a.synopsys, 
p.name, 
IFNULL(CAST(AVG(r.article_rating) AS DECIMAL(10,2)),0) AS avg_rating,
IFNULL(COUNT(r.article_rating),0) AS number_of_ratings,
IFNULL(COUNT(CASE WHEN c.status = 1 THEN 1 END),0) AS number_of_comments    -- this is new
FROM article a
JOIN publicist p ON p.id = a.publicist_id
LEFT JOIN rating r ON r.article_id = a.id     -- LEFT JOIN here
LEFT JOIN comment c ON c.article_id = a.id    -- this is new
GROUP BY a.id;
我还试图只统计状态设置为1的评论,而不是重要的评论。 到目前为止,它所做的是把我上一个版本的评分数字弄乱了,似乎它在评分的数量和评论的数量上都是随机的

例如:
第1条有7个评级和3个评论
第2条有3个评级和3个评论(2个活跃,1个不活跃)
第1条:
第一版:评级数量:7

第二版:评分数:14,评论数:14

第1条:
第一版:评级数量:3

2版:评分数:9,评论数:6

我不知道如何解决这个问题,甚至不知道它为什么会这样。
另外,我的计数是否正确(c.status=1,则1结束)


谢谢大家!

我认为您可以在子查询中计算每篇文章的评论数,然后加入子查询:

选择article.id,
第1条标题,
第2.2条,
公关人员姓名,
IFNULL(CAST(额定值。物品额定值)为十进制(10,2)),0)为平均额定值,
如果NULL(计数(评级。文章评级),0)作为评级的编号,
IFNULL(c.CommentCount,0)作为注释的数量——新
从文章
加入publicist上的publicist.id=publicist\u id
在rating.article\u id=article.id上加入评级
加入(--新
选择文章编号,计数(*)作为注释计数
评论
按文章分组\u id
)c ON article.id=c.article\u id
按article.id分组;

“联合乘法”。在子查询中计数,然后加入。@Akina谢谢,我不知道加入乘法。Umberto petrov在他的回答中使用了这种方法,效果非常好。@草莓,谢谢你,我是新来的,我以后会更加关注我的帖子质量。没有时间像现在这样。谢谢你,效果非常好。将最后2个连接切换为左连接,以便显示评分/评论为0的文章。
SELECT a.id, 
a.title, 
a.synopsys, 
p.name, 
IFNULL(CAST(AVG(r.article_rating) AS DECIMAL(10,2)),0) AS avg_rating,
IFNULL(COUNT(r.article_rating),0) AS number_of_ratings,
IFNULL(COUNT(CASE WHEN c.status = 1 THEN 1 END),0) AS number_of_comments    -- this is new
FROM article a
JOIN publicist p ON p.id = a.publicist_id
LEFT JOIN rating r ON r.article_id = a.id     -- LEFT JOIN here
LEFT JOIN comment c ON c.article_id = a.id    -- this is new
GROUP BY a.id;