WHERE语句中的COUNT个连接记录

时间:2014-06-26 11:59:19

标签: sql join count where

我有以下表格:

发表:

id   status
1    0
2    1
3    1

注释:

id   post_id 
1    2
2    1
3    3
4    2

我想要选择状态= 0的帖子或帖子有评论。我提出了这个问题:

SELECT t.*, COUNT(cmt.id) as commentsCount FROM `post` `t` LEFT JOIN comment cmt ON (cmt.post_id = t.id) WHERE t.status='0' OR commentsCount>0 GROUP BY t.id 

但它并不合适。

如何解决这个问题?

P.s只有简化的表格才能使这更容易理解,在我的数据库中,我无法添加计数字段。

3 个答案:

答案 0 :(得分:1)

您需要将此条件放在having子句中:

SELECT t.*, COUNT(cmt.id) as commentsCount
FROM `post` `t` LEFT JOIN 
      comment cmt
      ON (cmt.post_id = t.id)
WHERE t.status = '0'
GROUP BY t.id 
HAVING commentsCount > 0;

编辑:

对于or逻辑,您可以将两个条件移到having子句:

SELECT t.*, COUNT(cmt.id) as commentsCount
FROM `post` `t` LEFT JOIN 
      comment cmt
      ON (cmt.post_id = t.id)
GROUP BY t.id 
HAVING max(t.status) = '0' OR commentsCount > 0;

严格来说,max()是不必要的,因为id是主键。但为了清楚起见,我将其包括在内。

答案 1 :(得分:1)

还有更简单的方法将您的查询从英语翻译成SQL:

SELECT *
FROM post
WHERE status='0'
  or (select count(1) from comment where post_id = post.id) > 0

我建议您检查哪个查询可以更好地规划您的数据(使用join或子​​查询)。无论如何,强烈建议您使用特殊的过滤字段。

答案 2 :(得分:0)

在group by子句中,除了具有聚合函数的字段之外,您还需要select子句中的所有字段。所以你的查询将是:

SELECT t.id, t.status, COUNT(cmt.id) as commentsCount FROM `post` `t` 
LEFT JOIN comment cmt ON (cmt.post_id = t.id) 
WHERE t.status='0' OR commentsCount>0 GROUP BY t.id, t.status

此外,由于状态始终为零,您可能会将其从select和group by子句中删除。

SELECT t.id, COUNT(cmt.id) as commentsCount FROM `post` `t` 
LEFT JOIN comment cmt ON (cmt.post_id = t.id) 
WHERE t.status='0' OR commentsCount>0 GROUP BY t.id