[英]SQL LEFT JOIN help
我的情况:有3个表用于存储电视节目信息; 季节,剧集和Episode_translation。
我的数据:有3个季节,每个季节有3集,但是只有一个集有翻译。
我的目标:我想获得一场演出的所有季节和情节的清单。 如果有指定语言的翻译版本,请显示它,否则显示null。
我试图以语言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
LEFT JOIN episode_trans
ON episode_trans.id_episode = episode.id_episode
AND episode_trans.id_lang = 1
WHERE id_serie=1
我在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提供它会导致交叉连接-笛卡尔积。
您可能需要将id_lang = 1移到LEFT JOIN子句中,而不是WHERE子句中。 这样想吧...对于所有没有翻译的行,LEFT JOIN为您提供所有这些翻译列的空值。 然后,在WHERE子句中检查该值是否等于1-当然,该值等于FALSE。
如果您下次在问题中而不是链接中包含代码,可能会更容易。
你可以尝试使用
LEFT OUTER JOIN
代替
NATURAL LEFT JOIN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.