如何编写MySQL查询语句连接Sakila数据库的film与language表以获取影片及其语言和原始语言信息
没问题,这个需求其实很容易实现——你只需要两次关联language表,并且给每个关联的表起不同的别名来区分两种语言即可。
为什么要两次关联?
因为你需要获取两类语言信息:影片当前使用的语言(对应film.language_id),以及影片的原始语言(对应film.original_language_id)。这两个字段都关联到language表的主键,所以我们需要分别把它们和language表做关联,用别名来避免字段冲突。
修改后的查询语句
这里推荐用LEFT JOIN而不是INNER JOIN来关联原始语言,因为有些影片可能没有设置原始语言(original_language_id为NULL),LEFT JOIN可以保证这些影片的信息依然能被查询出来:
SELECT film.title, film.description, film.release_year, -- 当前影片语言信息,用别名区分 lang.language_id AS film_language_id, lang.name AS film_language_name, -- 原始影片语言信息,同样用别名 original_lang.language_id AS original_language_id, original_lang.name AS original_language_name FROM film -- 关联当前影片语言 INNER JOIN language AS lang ON film.language_id = lang.language_id -- 关联原始影片语言,用LEFT JOIN兼容NULL的情况 LEFT JOIN language AS original_lang ON film.original_language_id = original_lang.language_id;
关键说明
- 给两次关联的
language表分别起了lang和original_lang的别名,这样MySQL就能区分你要调用哪一个关联表的字段了。 - 给查询出来的语言字段也起了别名(比如
film_language_name),这样结果集里的字段会更清晰,不会出现多个name、language_id导致混淆的情况。 - 如果确定所有影片都有原始语言,也可以把
LEFT JOIN换成INNER JOIN,但LEFT JOIN的兼容性更好。
内容的提问来源于stack exchange,提问作者John




