2011-06-13 3 views
2

기본 키인 UserId 열이 하나만있는 테이블 Users이 있다고 가정합니다.이 MySQL 쿼리를 작성하는 방법은 무엇입니까?

두 번째 테이블 Events에는 EventId, UserIdStatus의 세 열이 있습니다. A StatusBOOL NOT NULL입니다. UserId은 색인되지만 고유하지는 않습니다.

테이블 Status에는 에 외래 키 제약 UserId이 있습니다.

이제는 Event.Status = TRUE과 같은 Events에 행이없는 모든 UserId을 쿼리하려고합니다. JOIN으로이 작업을 수행 할 수 있습니까?

Users 
-------- 
1 
2 
3 

Events 
-------- 
EventId UserId Status 
1   1  FALSE 
2   1  TRUE 
3   2  FALSE 
4   2  FALSE 

그럼 내가 찾고 쿼리가 반환해야합니다 : 예를 들어

(하나의 명령문은 선호)

UserId 
------- 
2 
3 

감사합니다! 이 같은

답변

3

놀랍게도, 부속 선택은 MySQL을이 작업을 수행 할 수있는 reasonably efficient 방법입니다. 그래서 : 참조 된 기사에 대한 완벽한 적합하지 않을 수 있습니다 내가 거기에 DISTINCT을 사용하고

SELECT UserId 
FROM Users 
WHERE UserId NOT IN (
     SELECT DISTINCT UserID 
     FROM Events 
     WHERE Status = TRUE 
     ) 

참고. 당신이 DISTINCT으로 괜찮을 수도 있습니다. 또는 해제해도됩니다 (그러나 문제가있는 임시 데이터 세트가 생기는지 또는 MySQL이 그것에 대해 영리한 지 여부는 알 수 없습니다).

또는 좌가 가입 할 수있는 /를 DISTINCT 문제가없는 NULL 버전, IS :

SELECT Users.UserId 
FROM  Users 
LEFT JOIN Events 
      ON Events.UserId = Users.UserId AND Events.Status = TRUE 
WHERE  Events.UserId IS NULL 

이 토론에 대한 위의 링크를 참조하십시오,하지만 MySQL은 기본적으로 두 경우 모두 동일한 성능을 제공합니다 (NOT IN이 아닌 NOT EXISTS을 사용하면 효율성이 현저히 떨어집니다).

두 가지 모두 시도해보십시오 (또는 처음 시도 할 때 DISTINCT을 사용하거나 사용하지 않을 경우 모두 세 가지 방법을 시도해보십시오). 실제 데이터와 가장 잘 어울리는 부분을 확인하십시오.

+0

왼쪽 결합이 더 좋은 옵션 인 것 같습니다. 첫 번째 옵션은 성능에 영향을 줄 수있는 DISTINCT를 사용합니다. http://sackoverflow.com/questions/521055/in-sql-how-does-using-distinct-affect-performance – isobar

+0

@isobar : 좋은 지적, 참조 된 문서는 DISTINCT를 사용하지 않으며 성능 특성이 달라집니다. 거기에. –

+0

고마워! 당신들은 멋진데! =) 사실, 다행히도 실제 시나리오에서 테이블은 UserId 당 하나의 TRUE 만 가질 것입니다. – javic

2

뭔가 : 왼쪽으로

select UserId 
from Users 
where UserId not in (
    select UserId 
    from Events 
    where Status = TRUE) 

가입은 :

select UserId 
from Users usr 
    left join Events evt on 
     evt.UserId = usr.UserId and evt.Status = TRUE 
where evt.UserId is null 
+0

음 ... 두 개의 답변을 틱 할 수 없습니까? 자, 둘 다 맞습니다. – javic

+0

@javic - 저는 처음이었습니다. :) –

+0

@ T.J. Crowder - 공정한 :). 대답을 당신의 것이되게하십시오 :). 참고 자료도 제공 할 수 있습니다. 나는 이것이 질문에서 물어 보지 않았다고 믿는다. 질문에 대답하고 있었어. –

관련 문제