SQL LEFT JOIN帮助

时间:2010-06-15 14:07:17

标签: sql mysql join innodb

我的情景:有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

4 个答案:

答案 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