如何链接SQL查询

时间:2017-08-31 20:07:14

标签: mysql sql

我有四个表:seriesseasonsepisodesimages。每个系列由多个季节组成,包括多个剧集。每集都附有一个或多个图像。现在我想找回一个系列,包括它的所有季节,剧集和图像。

SELECT * FROM series
LEFT JOIN seasons ON seasons.seasons_series_id=series.series_id
LEFT JOIN episodes ON episodes.episodes_seasons_id=seasons.seasons_id
LEFT JOIN images ON images.images_id=episodes.episodes_images_id
WHERE series.series_id=1

上述查询不起作用,因为seasons_id在运行第二个LEFT JOIN等时不可用。我应该使用嵌套查询吗?

3 个答案:

答案 0 :(得分:2)

在发布到问题的查询中,seasons_id通常 IS 可用于第二个LEFT JOIN(第三个,如果它可用)。

当您向查询添加其他JOIN时,这些JOIN不仅会考虑原始FROM子句中的表,还会考虑任何由此构建的整个结果集到目前为止已增加JOIN。这就是为什么始终使用表的别名是一个好主意的一个原因...它可以通过JOIN多次在查询中包含相同的表,并且别名可以保持同一个表的单独实例非常重要。

当您的seasons_id无效时,唯一的情况是您的series记录没有与之关联的seasons条记录。在这种情况下,您在NULL的结果中会有seasons_id值,并且您将无法在显示的模式中将任何episode记录与{{1}连接起来完全记录。在此架构中,如果要seriesseries,则每个season必须至少有一个episodes。因此,失踪的images无论如何都无关紧要,因为您无法希望匹配seasons_id的任何episode条记录。

答案 1 :(得分:1)

您的查询没有任何问题..如果关系出现故障并且左连接显示为例如没有已知剧集的第2季,那么这些非剧集就不会有任何图像。它并没有阻止有两个赛季的系列赛,你只看到如下结果:

Game of thrones, season 1, episode 1, image 1
Game of thrones, season 2, null, null

如果您的数据库强制执行关系,那么您将永远无法从第2季第1集的权力游戏中插入图像,因为该集必须首先存在才能成为子图像的父级。如果你的数据库没有强制执行关系,那么你可以继续插入一大堆图像并给它们所有的剧集ID 971,你预测这是你在插入它时会得到的s2 e1,但是他们赢了在你的查询中显示,因为如果数据库中不存在ID为971的剧集,他们就是孤儿

如果您希望查询显示这些孤立的图像,则必须以不同的方式编写

答案 2 :(得分:-1)

您可能缺少列,因为您没有为表使用别名,因此MySQL不知道哪个列属于每个表。尝试为每个表使用别名并再次运行。

希望这有帮助