CodeIgniter查询从结果中排除子集

时间:2015-06-19 00:23:29

标签: php mysql codeigniter join codeigniter-3

在执行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 SmithJoe 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。

结果中的每个用户:

  • 必须在第1组
  • 不得在第6组
  • 可能是也可能不是任何其他集团

任何建议表示赞赏。

2 个答案:

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