2011-08-27 3 views
1

저는 지금 특정 결과를 얻고 몇 시간 씩 묶어 왔으며 웹에서 답변을 찾지 못했습니다. SQL 전문가가 아니기 때문에 모두으로 질문을 드리겠습니다. 사용자가 차에 준 모든 점수를 저장 user (id, name ...), cars (id, type, color, engine power ...) 및 중간 테이블 :3 개의 테이블을 결합 할 때 검색하는 방법 중 하나에 대한 결과를 제외 하시겠습니까?

내가 3 개 테이블이 scores (id , user_id, car_id, score).

특정 사용자에게 반환 할 수있는 쿼리를 찾으려고합니다. 그는 아직 평가하지 않았습니다. 나는 다음을 시도했지만 null을 반환한다 :

$q=mysql_query("SELECT * FROM cars LEFT OUTER JOIN scores ON cars.id = scores.car_id WHERE scores.user_id != ('".$userId."')"); 

누군가가 단서를 가지고 있는가?

답변

2
SELECT 
    * 
FROM 
    cars 
WHERE 
    NOT EXISTS (SELECT 1 FROM scores WHERE car_id = cars.id AND user_id = ?) 

여기에서 ?은 해당 사용자의 ID입니다.

scores의 복합 색인이 (car_id, user_id) 이상인 경우 유용합니다.

+0

와우, 그것은 완벽하게 작동합니다, 감사합니다 milion를! 내가 전에 말한 복합 인덱스를 확인해 보겠습니다. 전에 사용하지 않았던 ... – BoDeX

2

당신은 작은 수정과 코드를 사용할 수 있습니다

SELECT * FROM cars 
LEFT OUTER JOIN scores ON cars.id = scores.car_id and scores.user_id=".$userId." 
WHERE scores.id IS NULL 
+1

+1 그건 대안입니다. IMHO는 NOT NOT EXISTS만큼 표현력이 없습니다. – Tomalak

+0

대체 방법이 아니므로이 쿼리는 완전히 잘못되었습니다. – zapadlo

+0

@Zapadlo 댓글을 설명해 주시겠습니까? 이 쿼리에서 완전히 잘못된 것은 무엇입니까? 나는이 같은 코멘트를 게시하기 전에 SQL에 대해 더 읽고 있어야한다고 생각한다. :) –

1
SELECT * FROM 
car c 
WHERE c.id NOT IN (
    SELECT s.car_id 
    FROM score s, user u 
    WHERE u.id = s.user_id 
     AND u.id = ? 
) 
+0

정말'user' 테이블이 필요합니까? –

+0

호 [12 개 더 가야 ...] – zapadlo