我有一个看似简单的问题,但无法通过SQL找出正确的解决方案。我专门使用postgresql。
采取以下措施:
SELECT * FROM users INNER JOIN tags ON (tags.user_id = users.id) WHERE tags.name IN ('word1', 'word2')
这不能满足我的需求。我想查找其标签仅包含在列表中的用户。如果用户具有不在列表中的标签,则不应包括该用户。
‘user1’标签:word1,word2,word3’user2 ‘标签: word1’user3’标签:word1,word2
给定:word1和word2。我想准备一个返回“ user2”和“ user3”的查询。排除了“ user1”,因为它具有不在列表中的标记。
希望我明确了这一点。谢谢你的帮助!
依靠COUNT(*)= 2将要求标签表中不能有user_id和name的重复项。如果是这样,我会选择那条路线。否则,这应该起作用:
SELECT u.* FROM users AS u WHERE u.id NOT IN ( SELECT DISTINCT user_id FROM tags WHERE name NOT IN ('word1', 'word2') ) AND EXISTS (SELECT user_id FROM tags WHERE user_id = u.id)