2012-01-21 2 views
0

내가 무엇을 가지고 :MySQL : 단 하나의 행을 가진 사용자 만 잡으시겠습니까?

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 2,3,4 .. 아닙니다.

+0

@ Lukas Eder는 매력처럼 작동했습니다! 왜 당신은 당신의 대답을 제거 했습니까? 또한 지정된 두 가지 역할을 가진 사용자 만 포함시키고 싶은지 알고 있습니까? 예 IN (1, 4)? 그런 다음 사용자가 2,4가 있는지 보여줘야합니다 (쿼리와 일치하는 쿼리가 4 건으로 인해 합법적이라고 생각하기 때문에) – Karem

+0

최상의 성능 솔루션이 아니라 MySQL과 관련하여 매우 만족 스럽습니다. 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에 두 번 합류 했으므로 최고의 실적이 아닐 수도 있습니다. 나는 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

이것은 훌륭하게 작동합니다. 또한 지정된 두 가지 역할을 가진 사용자 만 포함시키고 싶은지 알고 있습니까? 예 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

관련 문제