在执行JOIN
之后,我在确定如何编写正确的查询时遇到了一些麻烦。我需要让第1组中的所有用户排除这些结果的一部分。
表users
:
id name
1 John Smith
2 Joe Blow
3 Mary Jane
表users_groups
:
user_id group_id
1 1
1 3
1 4
2 1
2 4
2 5
3 1
3 6
第6组中的每个人也将在第1组中,但是,并非第1组中的每个人都在第6组中。换句话说,第6组是第1组的子集。
我需要一个查询,它会为我提供第1组中所有用户的列表(同时排除第6组中的用户)。对于上面的示例,我应该得到两个结果,John Smith
和Joe Blow
。
我正在使用CodeIgniter v3
这是我的尝试(为清楚起见,我删除了缓存代码)...
$this->db->from('users');
$this->db->select('
users.id AS `id`,
users.name AS `name`,
users_groups.group_id AS `group_id`
', FALSE);
$this->db->join('users_groups', 'users_groups.user_id = users.id', 'LEFT');
$this->db->group_by('users.email'); // remove duplication caused by JOIN
$this->db->where('users_groups.group_id = 1'); // get all users in Group 1
$this->db->where('users_groups.group_id <> 6'); // ignore all users in Group 6
return $this->db->get()->result_array();
我遇到的问题是我总是得到第1组中的完整用户列表。因为JOIN
生成了所有用户和所有组的列表,其中列出了同一个用户的多个时间,该人所属的每个集团的一个条目。我的查询是删除Group 6条目,但这并不好,因为相同的用户也在Group 1中。
我刚刚解释了为什么我的查询失败了,但我仍然无法弄清楚如何取得成功。如何获取Group 1用户,然后删除第1组和第1组中的用户子集。 6?这些用户也可以在其他群组中,但应忽略这些用户...我只想排除群组1和群组中的用户。第1组中的用户列表中的6。
结果中的每个用户:
任何建议表示赞赏。
答案 0 :(得分:1)
你需要一个&#34;不存在&#34;那里的子句作为过滤器。
char** a[20]
我不熟悉代码点燃,但我确定这是可行的
答案 1 :(得分:0)
感谢Philip's answer,它正在发挥作用。这是在CodeIgniter中如何做到的......
$this->db->where('users_groups.group_id = 1'); // get all users in Group 1
$this->db->where('
NOT EXISTS (
SELECT 1 FROM users_groups x
WHERE x.user_id = users_groups.user_id AND group_id = 6
)
'); // exclude users in Group 6