嘿,我正在写 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 子句或 NOT IT 但它不起作用。 感谢您的帮助。
最佳答案
如果您正在寻找具有任何其中一个标签的帖子,您可以执行以下操作:
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,则从 SELECT
中删除 post.id
。
如果您想要所有三个标签和没有重复项(合理的假设),则将HAVING
更改为:
HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) = 3;
关于mysql - 使用 WHERE IN 子句检查值是否不存在 - MYSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235896/