2010-12-22 4 views
4

다른 SO 사용자의 질문에 대한 답을하려했으나 할 수 없었습니다. JOINS는 여전히 나를 피합니다. 인종 (모든 인종의 목록), 결과 (각 종족에 대한 결과), 드라이버 (드라이버 정보) :MYSQL LEFT JOIN 3 테이블에 NULL 세트가 포함되어 있습니다.

나는 세 개의 테이블이있다. 모든 드라이버가 특정 트랙의 모든 레이스에서 경쟁하지는 않습니다.

레이스 테이블

| race_id | track_id | year | complete | 
+-----------+------------+--------+----------+ 
| 1   | 1   | 2006 | 1  | 
| ...  | ...  | ... | ...  | 
| 21  | 1   | 2007 | 1  | 
| ...  | ...  | ... | ...  | 
| 135  | 1   | 2008 | 1  | 
| ...  | ...  | ... | ...  | 
| 215  | 1   | 2009 | 1  | 
| ...  | ...  | ... | ...  | 
| 292  | 1   | 2010 | 1  | 
| ...  | ...  | ... |...  | 
| 351  | 1   | 2011 | 0  | 
+-----------+------------+--------+----------+ 

| race_id | driver_id | finish | 
+---------+-----------+--------+ 
| 135  | 1   | 15  | 
| ...  | ...  | ... | 
| 292  | 1   | 6  | 
+---------+-----------+--------+ 

| driver_id | name  | 
+-----------+------------+ 
| 1   | Joe Driver | 
+-----------+------------+ 

드라이버 테이블 내가 보여주는 결과 집합 원하는

결과 테이블 :

| name  | race_id | year | finish | 
+------------+---------+--------+--------+ 
| Joe Driver | 21  | 2007 | NULL | 
| Joe Driver | 135  | 2008 | 15  | 
| Joe Driver | 215  | 2009 | NULL | 
| Joe Driver | 292  | 2010 | 6  | 
+------------+---------+--------+--------+ 

조 드라이버 만 2,006 후, track_id = 1에서했던 4 개 종족의 2 경주 만 완료 인종을 포함 (1)

이 내 현재 쿼리입니다 :

SELECT driver.driver, race.id, race.year, result.finish 
FROM race 
LEFT JOIN result ON race.id = result.race_id 
LEFT JOIN driver ON result.driver_id = driver.driver_id 
WHERE race.track_id = 1 
AND race.year > 2006 
AND race.complete = 1 
AND driver.driver_id = 1 
ORDER BY race.id ASC 

결과 나는에 조인 간단한 규칙을 내려다 해요 확신

| name  | race_id | year | finish | 
+------------+---------+--------+--------+ 
| Joe Driver | 135  | 2008 | 15  | 
| Joe Driver | 292  | 2010 | 6  | 
+------------+---------+--------+--------+ 

: 난 단지 운전자가에 있던 종족을 보여줍니다거야?

감사합니다.

답변

3
SELECT driver.driver, race.id, race.year, result.finish 
FROM race 
CROSS JOIN 
     driver 
LEFT JOIN 
     result 
ON  result.race_id = race.id 
     AND result.driver_id = driver.driver_id 
WHERE race.track_id = 1 
     AND race.year > 2006 
     AND race.complete = 1 
     AND driver.driver_id = 1 
ORDER BY 
     race.id ASC 
+0

Quassnoi : 감사합니다! 그것은 속임수를 정확하게합니다. CROSS JOIN이 열쇠 인 것 같습니다. CROSS JOIN과 LEFT JOIN이 다른 모든 드라이버를 쿼리에서 제외시키는 방법에 대한 지능적인 질문을하고 싶습니다.하지만 할 수는 없습니다. JOINS에 대해 더 자세히 알기위한 최고의 리소스에 대한 제안? – darrenfauth

+0

@darrenfauth : 고급 주제에 대해서는 시동기와 내 사이트 http://explainextended.com에 대한 설명서를 읽으십시오. – Quassnoi

+0

그리고 다른 드라이버를 걸러내는'WHERE' 절에'driver.driver_id = 1'이 있습니다. 조인이 아닙니다. 'driver.driver_id = 1'을 제거하면 모든 드라이버를 볼 수 있습니다. – Quassnoi