2009-10-21 2 views
10

2 개의 테이블이 있습니다. 하나는 배울 수있는 것들을 가진 테이블입니다. 각 행의 행을 처리하고 각 행마다 고유 한 JID가 있습니다. 두 번째 테이블은 학습 한 것의 로그 (JID)와 그것을 배운 사람의 사용자 ID입니다. 현재 JID에 대한 모든 데이터를 선택하는 데이 옵션을 사용하고 있지만 사용자가 userid를 기반으로 배운 데이터 만 선택합니다.선택 * table1에서 table2에 존재하지 않는 조건부

SELECT * 
FROM tablelist1 
LEFT JOIN tablelog2 ON (tablelist1.JID = tablelog2.JID) 
         AND tablelog2.UID = 'php var' 
WHERE tablelog2.JID IS NOT NULL 

이제 학습 할 항목 행을 선택해야하지만 사용자 ID가 아직 학습하지 않은 사항 만 선택해야합니다. 나는 분명히 이것에 아주 새롭다, 나와 곰. :) 나는 IS NULL을 사용하여 노력했지만 그것이 작동하는 동안, 그것은 중복되는 JID의 하나가 NULL이되고, 하나는 옳다.

SELECT t.* 
    FROM TABLE_LIST t 
WHERE t.jid NOT IN (SELECT tl.jid 
         FROM TABLE_LOG tl 
        GROUP BY tl.jid) 

NOT EXISTS 사용 : 않고 사용

SELECT t.* 
    FROM TABLE_LIST t 
LEFT JOIN TABLE_LOG tl ON tl.jid = t.jid 
    WHERE tl.jid IS NULL 

:

답변

16

LEFT join을 사용하여이/NULL IS FYI

SELECT t.* 
    FROM TABLE_LIST t 
WHERE NOT EXISTS(SELECT NULL 
        FROM TABLE_LOG tl 
        WHERE tl.jid = t.jid) 


좌/가입 NULL IS 와 NOT IN은 MySQL에서 동등하다. NOT EXISTS가 더 느리거나 덜 효율적이기는하지만 아프다. 자세한 내용은 : http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/

+0

그것은 하위 쿼리를 사용하여 w/o 할 수 있습니까? 하위 쿼리는 매우 느리고 테이블 2에는 많은 행이 있습니다. 동일한 방법으로 처음에는 조인을 사용했습니다. – user192738

+1

왼쪽 가입은 완벽하게 작동했습니다. FYI에 감사드립니다. 나는 여분의 선택이 느려지는 것처럼 보이지만, NOT IN이 동등하다는 것을 알지 못했다! – user192738

3

첫째로, 당신은 INNER 기존 쿼리에 가입 사용해야합니다 :

SELECT * FROM tablelist1 
    INNER JOIN tablelog2 ON (tablelist1.JID = tablelog2.JID) 
    WHERE tablelog2.UID = 'php var' 

당신이 tablelist1에서 모든 행을 받고있어 그 일을하고있는 방법은 다음

가는 tablelog2에서 일치하지 않는 항목을 제외하는 추가 문제가 있습니다. INNER JOIN이이를 위해보다 효율적으로이를 수행 할 것입니다.

둘째, 사용자가 "X"의 사용자가 배운 것을 모든 학습 가능 - 일을 찾기 위해 수행

SELECT * FROM tablelist1 
    WHERE NOT EXISTS (SELECT JID FROM tablelog2 WHERE UID = 'X') 
+0

첫 번째 제안을 테스트 할 것입니다. 두 번째 (존재하지 않음)는 더 쉽지만 느리고 t2log가 많은 레코드를 가질 수 있으므로 피하고 싶습니다. – user192738

+0

두 번째 명령의 실행 시간은 주로 tablelist1의 크기와 tablelog2의 UID = 'X'와 일치하는 레코드 수에 따라 달라집니다. 하위 쿼리는 쿼리의 주요 부분과 상관 관계가 없으며 한 번 실행하면되며 UID, JID가있는 경우 포함 인덱스에 의해 쉽게 처리됩니다. –

+0

추신 : 두 번째 명령이 너무 느린 것을 알고 계시나요? 아니면 그런 종류의 건설을 피하기 위해 어딘가에서 읽으 셨을 것입니다. UID "X"에 대해 많은 수의 학습 된 것이없는 한 먼저 테스트하십시오. –

관련 문제