2010-06-15 136 views
2

我的場景:有3個表格用於存儲電視節目信息;季節,情節和episode_translation。SQL LEFT JOIN幫助

我的數據:有3季,每季3集,但只有一集的翻譯。

我的目標:我想獲得一個節目的所有季節和劇集列表。如果有指定語言的翻譯,請顯示它,否則顯示爲空。

我試圖讓意甲1信息語言1:

SELECT 
    season_number AS season,number AS episode,name 
    FROM 
    season NATURAL JOIN episode 
    NATURAL LEFT JOIN episode_trans 
    WHERE 
    id_serie=1 AND 
    id_lang=1 
    ORDER BY 
    season_number,number 

結果:

+--------+---------+--------------------------------+ 
| season | episode | name       | 
+--------+---------+--------------------------------+ 
|  3 |  3 | Episode translated into lang 1 | 
+--------+---------+--------------------------------+ 

預期的結果

+-----------------+--------------------------------+ 
| season | episode| name       | 
+-----------------+--------------------------------+ 
|  1 |  1 | NULL       | 
|  1 |  2 | NULL       | 
|  1 |  3 | NULL       | 
|  2 |  1 | NULL       | 
|  2 |  2 | NULL       | 
|  2 |  3 | NULL       | 
|  3 |  1 | NULL       | 
|  3 |  2 | NULL       | 
|  3 |  3 | Episode translated into lang 1 | 
+--------+--------+--------------------------------+ 

全部DB轉儲 http://pastebin.com/Y8yXNHrH

+0

這應該被標記爲MySQL – 2010-06-15 14:09:28

+0

哪個版本的SQL? – AllenG 2010-06-15 14:11:15

+0

你在where子句中指定id_lang = 1。如果你把它拿出來,它是否會返回預期的結果? – Shaded 2010-06-15 14:12:15

回答

1

你可能需要將id_lang = 1而不是移動到LEFT JOIN子句中的WHERE子句。想想這樣......對於所有這些沒有翻譯的行,LEFT JOIN都會爲所有這些翻譯列返回NULL。然後在WHERE子句中檢查是否等於1 - 哪個當然評估爲FALSE。

如果您將代碼包含在下一次問題中而不是鏈接中,可能會更容易。

1

你可以嘗試使用

LEFT OUTER JOIN 

代替

NATURAL LEFT JOIN 
+0

我已將「NATURAL LEFT JOIN episode_trans」更改爲「LEFT OUTER JOIN episode_trans USING(id_episode)「,但我得到了相同的結果 – 2010-06-15 14:22:16

+0

檢查Anthony Faull的回答,他是正確的,where條件應該在Join條件中,否則沒有什麼可以完成連接。 – 2010-06-15 14:27:07

2
LEFT JOIN episode_trans 
    ON episode_trans.id_episode = episode.id_episode 
    AND episode_trans.id_lang = 1 
WHERE id_serie=1 
+0

謝謝安東尼, 沒有「episode_trans.number」字段,我假設你的意思是「episode.id_episode」。我會盡快投票你的答案(我還沒有足夠的聲望投票) – 2010-06-16 11:06:38

2

我測試在MySQL 4.1以下的 - 它返回你期望的輸出:

SELECT s.season_number AS season, 
      e.number AS episode, 
      et.name 
    FROM SEASON s 
    JOIN EPISODE e ON e.id_season = s.id_season 
LEFT JOIN EPISODE_TRANS et ON et.id_episode = e.id_episode 
          AND et.id_lang = 1 
    WHERE s.id_serie = 1 
ORDER BY s.season_number, e.number 

一般來說,當你使用ANSI-92 JOIN語法時,你n以指定ON條款中的加入標準。在MySQL中,我知道不爲INNER JOIN提供它會導致交叉連接 - 一個笛卡爾積。

+0

感謝OMG小馬, 你的回答是正確的。我會盡快投票答覆(我沒有足夠的聲望投票) – 2010-06-16 11:07:44