2010-06-15 142 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