我的情景:有3个表用于存储电视节目信息;季节,剧集和episode_translation。
我的数据:有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 |
+--------+--------+--------------------------------+
完整数据库转储 http://pastebin.com/Y8yXNHrH
答案 0 :(得分:2)
LEFT JOIN episode_trans
ON episode_trans.id_episode = episode.id_episode
AND episode_trans.id_lang = 1
WHERE id_serie=1
答案 1 :(得分: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语法时,您需要在ON
子句中指定连接条件。在MySQL中,我知道不为INNER JOIN提供它会导致交叉连接 - 一个笛卡尔积。
答案 2 :(得分:1)
您可能需要将id_lang = 1移动到LEFT JOIN子句而不是WHERE子句中。可以这样想......对于所有没有转换的行,LEFT JOIN会为所有这些转换列返回NULL。然后在WHERE子句中检查它是否等于1 - 当然其值为FALSE。
如果您下次在问题中包含代码而不是在链接中,则可能会更容易。
答案 3 :(得分:1)
您可以尝试使用
LEFT OUTER JOIN
而不是
NATURAL LEFT JOIN