我有四个表:series
,seasons
,episodes
,images
。每个系列由多个季节组成,包括多个剧集。每集都附有一个或多个图像。现在我想找回一个系列,包括它的所有季节,剧集和图像。
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等时不可用。我应该使用嵌套查询吗?
答案 0 :(得分:2)
在发布到问题的查询中,seasons_id
通常 IS 可用于第二个LEFT JOIN
(第三个,如果它可用)。
当您向查询添加其他JOIN
时,这些JOIN
不仅会考虑原始FROM
子句中的表,还会考虑任何由此构建的整个结果集到目前为止已增加JOIN
。这就是为什么始终使用表的别名是一个好主意的一个原因...它可以通过JOIN
多次在查询中包含相同的表,并且别名可以保持同一个表的单独实例非常重要。
当您的seasons_id
无效时,唯一的情况是您的series
记录没有与之关联的seasons
条记录。在这种情况下,您在NULL
的结果中会有seasons_id
值,并且您将无法在显示的模式中将任何episode
记录与{{1}连接起来完全记录。在此架构中,如果要series
或series
,则每个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不知道哪个列属于每个表。尝试为每个表使用别名并再次运行。
希望这有帮助