2014-10-29 138 views
-1

我对SQL很陌生,我正在处理一项任务,该任务要求我查找基于IMDB数据库的名称中包含“films”名称的公司所创建的电影。 此数据库的图表可以在这里查看: http://i.imgur.com/kj8qVgF.pngSQL - 查询帮助

这是我正在处理的查询。

SELECT t.title, t.id 
FROM title t, movie_link m 
JOIN movie_companies c ON (m.movie_id = c.movie_id) 
JOIN company_name n USING (id) 
WHERE n.name LIKE '%films%' 
+2

你得到的错误是什么.. – ryekayo 2014-10-29 19:45:18

回答

0

你的代码似乎确实有点接近你所需要的,但是那里有一些奇怪的东西。首先,隐式连接title t, movie_link m在这些表之间执行笛卡尔乘积。此代码应该工作:

SELECT DISTINCT t.id, t.title 
FROM title t 
INNER JOIN movie_companies mc 
    ON t.id = mc.movie_id 
INNER JOIN company_name cn 
    ON mc.company_id = cn.id 
WHERE cn.name LIKE '%films%' 

有几件事情,你需要从该图中考虑到,以获得你想要的结果。例如,由于不同的公司可能是同一部电影的创作者(图表允许),因此您需要使用DISTINCT否则您可能会得到重复的结果。

0

好像你缺少的titlemovie_link表之间的连接联接谓词。

我建议你不要在声明中混用“逗号”和“JOIN关键字”语法。也就是说,删除titlemovie_link之间的逗号,并将其替换为关键字JOIN。如果您不想交叉连接,请添加连接谓词。

此外,连接谓词中的USING语法对我的口味有点含糊不清。我建议您明确指定要匹配哪些表的列,就像您为加入movie_companies表所做的那样。

以下查询不可运行。该???需要用适当的标识符和别名来替换:

SELECT t.title 
    , t.id 
    FROM title   t 
    JOIN movie_link  m ON m.???  = t.??? 
    JOIN movie_companies c ON c.movie_id = m.movie_id 
    JOIN company_name n ON n.id  = ???.??? 
WHERE n.name LIKE '%films%' 
+0

似乎没有任何需要加入到“movie_link”表 – Lamak 2014-10-29 19:55:20

+0

@Lamak:你可能是对的。在后面的连接谓词中有一个来自该表的'movie_id'的引用。如果不需要该表,则可以从查询中移除包含“movie_link”的整行,并且可以修改引用该列的连接谓词。 (我可能会向后写入查询,从company_name表开始,作为FROM子句中的第一个表,然后将连接添加到每个附加表中。) – spencer7593 2014-10-29 19:57:46