0

を実行した後、適切なクエリを作成する方法を理解するのに苦労しています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 に属していてはなりません
  • 他のグループに属している場合とそうでない場合があります

任意の提案をいただければ幸いです。

4

2 に答える 2

1

フィルターとしてそこに「存在しない」句が必要です。

And not exists (select 1 from users_groups x where 
x.user_id = users_groups.user_id and group_id = 6

私はコード点火に慣れていませんが、これは実行可能であると確信しています

于 2015-06-19T00:45:51.373 に答える
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
于 2015-06-19T00:56:02.863 に答える