繁体   English   中英

SQL LEFT JOIN帮助

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM