を実行した後、適切なクエリを作成する方法を理解するのに苦労しています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 のユーザーは除外します)。上記の例では、2 つの結果が得られるはず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
同じユーザーが複数回リストされているすべてのユーザーとすべてのグループのリストが生成されるため、その人が属するグループごとに 1 つのエントリが作成されます。 . 私のクエリはグループ 6 エントリを削除していますが、同じユーザーがグループ 1 にも含まれているため、これは適切ではありません。
クエリが失敗する理由を説明しましたが、成功する方法がまだわかりません。グループ 1 のユーザーを取得してから、グループ 1 と 6 のユーザーのサブセットを削除するにはどうすればよいですか? これらのユーザーは他のグループに属することもできますが、無視する必要があります... グループ 1 と 6 に属するユーザーをグループ 1 のユーザーのリストから除外したいだけです。
結果の各ユーザー:
- グループ 1 に属している必要があります
- グループ 6 に属していてはなりません
- 他のグループに属している場合とそうでない場合があります
任意の提案をいただければ幸いです。