使用WHERE IN子句检查值是否存在 - MYSQL

时间:2016-03-26 13:33:14

标签: mysql sql

嘿我写的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条款或不是它但它不起作用。 谢谢你的帮助。

1 个答案:

答案 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;