我有以下表格:
发表:
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只有简化的表格才能使这更容易理解,在我的数据库中,我无法添加计数字段。
答案 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