2014-10-03 118 views
0

我有点困惑的一个愚蠢的查询:MySQL查询与多个INNER JOIN

我得到行从表帖子加入了与表作者和表评论,在这样的方式:

SELECT posts.*, authors.name, COUNT(comments.id_post) AS num_comments 
FROM posts JOIN authors ON posts.id_author = authors.id_author 
LEFT JOIN comments ON posts.id_post = comments.id_post 
WHERE posts.active = 1 
AND comments.active = 1 

这当然不起作用。

我尝试做的是检索:

1)我的所有积极的职位(如那些删除未标记);

2)他们作者的名字;

3)每个帖子(如果至少有一个)的活动评论数(没有标记为删除的评论数);

这是怎么回事?我知道这是一个微不足道的,但现在我的大脑处于越位...... 谢谢!

+0

你能否详细介绍一下“这没有用”? – Mureinik 2014-10-03 13:19:37

回答

0

既然你正在做一个计数,你需要有一个组。因此您需要添加

Group By posts.*, authors.name 
0

您应该将GROUP BY子句与聚合函数一起使用。尝试类似于:

SELECT posts.*, authors.name, COUNT(comments.id_post) AS num_comments 
FROM posts JOIN authors ON posts.id_author = authors.id_author 
LEFT JOIN comments ON posts.id_post = comments.id_post 
-- group by 
GROUP BY posts.*, authors.name 
-- 
WHERE posts.active = 1 
AND comments.active = 1 
1

据推测,id_post唯一标识posts每一行。试试这个:

SELECT p.*, a.name, COUNT(c.id_post) AS num_comments 
FROM posts p JOIN 
    authors a 
    ON p.id_author = a.id_author LEFT JOIN 
    comments c 
    ON p.id_post = c.id_post 
WHERE p.active = 1 AND c.active = 1 
GROUP BY p.id_post; 

请注意,这使用MySQL扩展。在大多数其他数据库中,您需要列出posts加上子句中的a.name的所有列。

编辑:

以上是根​​据您的查询。如果你想用积极的意见计数所有活动的帖子,只是做:

SELECT p.*, a.name, SUM(c.active = 1) AS num_comments 
FROM posts p LEFT JOIN 
    authors a 
    ON p.id_author = a.id_author LEFT JOIN 
    comments c 
    ON p.id_post = c.id_post 
WHERE p.active = 1 
GROUP BY p.id_post; 
+0

谢谢,但这种方式我只回复至少有一条评论处于活动状态的帖子。零评论的帖子被忽略... – 2014-10-03 14:59:29

+0

我的目标是检索所有活动帖子和每个帖子的评论数量,只计算当前**活跃**的评论数。 – 2014-10-03 15:10:48

0

我找到了正确的解决方案:

SELECT posts.id_post, authors.name, COUNT(comments.id_post) AS num_comments 
FROM posts JOIN authors 
ON posts.id_author = authors.id_author 
LEFT OUTER JOIN comments 
ON (posts.id_post = comments.id_post AND comments.active = 1) 
WHERE posts.active = 1 
GROUP BY posts.id_post; 

感谢大家的帮助!