嘿我写的SQL查询,我几乎完成了它但我需要改变重要的事情,但仍然没有想法修复它。有我的SQL示例
SELECT post.id,post.name as post_name,
(SELECT users.login FROM users WHERE post.creator = users.id) creator,
(SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) recommends,
(SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) comments,
GROUP_CONCAT(tags.tag SEPARATOR ',') as tags
FROM posts
LEFT JOIN tags
ON post.id = tags.idea_id
WHERE post.name IN
(
SELECT post.name FROM posts
JOIN tags ON post.id = post.idea_id
WHERE tags.tag IN ('X','Y','Z')
)
GROUP BY post.name
有什么问题?如果我们的X或Y或Z不存在,查询仍然有效。我不知道如何修复,我尝试了一些NOT EXISTS条款或不是它但它不起作用。 谢谢你的帮助。
答案 0 :(得分:0)
我正在寻找包含任何其中一个标签的帖子,您可以这样做:
SELECT post.id, post.name as post_name,
(SELECT users.login FROM users WHERE post.creator = users.id) as creator,
(SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) as recommends,
(SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) as comments,
GROUP_CONCAT(tags.tag SEPARATOR ',') as tags
FROM posts LEFT JOIN
tags
ON post.id = tags.idea_id
GROUP BY post.id, post.name
HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) > 0;
注意:我将GROUP BY
更改为包含post.id
(假设每个id
的名称都是唯一的)。在GROUP BY
子句中包含所有非聚合列是一种很好的做法。如果同一名称包含多个ID,请从post.id
删除SELECT
。
如果您希望所有三个标记和没有重复项(合理的假设),请将HAVING
更改为:
HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) = 3;