我有一个名为jos_user_usergroup_map的表,它有两列:user_id和group_id
用户可以是多个组的成员,因此在该表中有几行,每行都有组ID,例如
user_id|group_id
62 | 1
62 | 4
62 | 12
108 | 1
我想找到所有没有group_id = 12的user_id,但它让我头疼......
在上面的例子中,我应该只找到user_id = 108
任何想法如何做到这一点? 任何帮助表示赞赏。
由于
答案 0 :(得分:6)
试试这个:
SELECT DISTINCT A.user_id
FROM jos_user_usergroup_map A
LEFT OUTER JOIN jos_user_usergroup_map B ON A.user_id = B.user_id AND B.group_id = 12
WHERE B.user_id IS NULL;
答案 1 :(得分:2)
使用后聚合过滤
SELECT user_id FROM jos_user_usergroup_map
GROUP BY user_id
HAVING SUM(group_id=12)=0
答案 2 :(得分:0)
我会尝试类似的事情:
SELECT DISTINCT `user_id`
FROM `jos_user_usergroup_map`
WHERE `user_id` NOT IN (
SELECT `user_id`
FROM `jos_user_usergroup_map`
WHERE `group_id` = 12
)
或使用exist
s(可能比in
更快):
SELECT DISTINCT `user_id`
FROM `jos_user_usergroup_map`
WHERE NOT EXISTS (
SELECT `user_id`
FROM `jos_user_usergroup_map`
WHERE `group_id` = 12 AND `user_id` = `jos_user_usergroup_map`.`user_id`
)
但请注意,尽管这些解决方案在逻辑上易于理解,但基于JOIN
的答案在实践中通常要快得多。