2012-01-21 5 views
0

は私が持っているものです:MySQL:1つの行だけを持っているユーザーだけを掴んでいますか?

SELECT users.* 
      FROM users INNER JOIN roles_users ON users.id = roles_users.user_id 
      WHERE roles_users.role_id IN (1) 
      GROUP BY users.id 
      HAVING COUNT(*) = 1 
私はROLE_IDで、一列のみを持っているすべてのユーザーをつかむしたい

上記のクエリは、ROLE_ID 1と行を持つすべてのユーザーをつかむ1.

それで、例えば、role_id 2、role_id 3の行が多い人も表示されます。

どのように私はどこで行うことができますroles_users.role_id IN(1)AND NOT 2,3,4 ..何か?

+0

@ Lukas Ederは魅力的に機能しました!なぜあなたはあなたの答えを削除しましたか?また、指定した2つの役割を持つユーザーのみを含めるかどうかもわかりますか?例IN(1,4)?それで、ユーザーには2,4が表示されるべきではありません(クエリに4つのクエリが合法だと思うので) – Karem

+0

このSQLは、最高のパフォーマンスを発揮するソリューションではないと感じています。 1列分、すべての列を選択します)。しかし、元に戻してみましょう...私は 'IN(1、4)'を扱う方法を提案しました。 –

答えて

1

も他の役割

SELECT users.* 
FROM users 
INNER JOIN roles_users ON users.id = roles_users.user_id 
-- replace by IN (1, 4) if needed 
WHERE roles_users.role_id IN (1) 
AND NOT EXISTS (SELECT 1 FROM roles_users 
       WHERE roles_users.user_id = users.id 
        -- replace by NOT IN (1, 4) if needed 
        AND roles_users.role_id NOT IN (1)) 
GROUP BY users.id 
HAVING COUNT(*) = 1 
を持つユーザーを除外するために、抗参加追加

上記の内容は通常MySQLと同じように扱われますが、の一部ではない列は選択しないでください節。さらに、roles_usersusersに2回結合されているため、最高のパフォーマンスではない可能性があります。 MySQLがこれを最適化できるかどうかはわかりません。

+0

非常に良いソリューションです。ありがとうございました – Karem

0

(未テスト)これを試してみてください。このような

SELECT users.*, COUNT(*) AS roleX_count 
FROM users 
INNER JOIN roles_users ON users.id = roles_users.user_id 
GROUP BY users.id, roles_users.role_id 
HAVING roleX_count = 1 AND roles_users.role_id = 1 
0

何かがトリックを行う必要があります。

+0

これはうまくいきます。また、指定した2つの役割を持つユーザーのみを含めるかどうかもわかりますか?例IN(1,4)?それから、ユーザは2,4を持っているかどうかを示すべきではありません(4つのクエリーが合法だと思うので) – Karem

+0

INは "どちらか"を意味するので正しくありません。ロール1とロール4のみを具体的に指定するには、WHERE roles_users.role_id = 1 AND roles_users.role_id = 4、カウント(*)の期待値を1から2に変更する必要があります。 – Gigi

関連する問題