cs50 pset7电影sql.12
有人能帮我修复SQL吗? 我在处理五张桌子。cs50 pset7电影sql.12,sql,sqlite,Sql,Sqlite,有人能帮我修复SQL吗? 我在处理五张桌子。 预期结果是, “编写SQL查询以列出所有电影的标题,其中 约翰尼·德普和海伦娜·邦汉·卡特主演“ 您的查询应该输出一个表,其中每个电影的标题只有一列。 您可以假设数据库中只有一个人 我叫约翰尼·德普 你可以假设数据库中只有一个人名叫海伦娜·邦汉·卡特 这将产生59行,其中应该只有6行 SELECT title FROM movies WHERE id IN (SELECT DISTINCT movie_id FROM stars WHERE
预期结果是,
SELECT title FROM movies WHERE id IN (SELECT DISTINCT movie_id FROM
stars WHERE person_id = (SELECT id FROM people WHERE name IN
("Johnny Depp", "Helena Bonham Carter")));
我看到其他帖子谈论使用“WHERE IN”会有帮助,我确实在使用它。使用
JOIN
和INTERSECT
帮助我解决了这个问题
大概是这样的:
Select title from movies
join stars on stars.movie_id = movies.id
join people on people.id = stars.person_id
where people.name = "Helena Bonham Carter"
INTERSECT
Select title from movies
join stars on stars.movie_id = movies.id
join people on people.id = stars.person_id
where people.name = "Johnny Depp";
我使用了下面这样的方法,它比使用
INTERSECT
要快一点
SELECT title FROM movies WHERE id IN (
SELECT movie_id FROM stars
JOIN people
ON stars.person_id = people.id
WHERE name = "Helena Bonham Carter" AND movie_id IN
(SELECT movie_id FROM stars WHERE person_id IN
(SELECT id FROM people WHERE name = "Johnny Depp")
))
ORDER BY title
使用计数:
SELECT title FROM movies WHERE id IN
(SELECT movie_id FROM
(SELECT count(person_id) as together, movie_id FROM stars WHERE person_id IN
(SELECT id FROM people WHERE name IN ('Johnny Depp','Helena Bonham Carter'))
GROUP BY movie_id)
WHERE together > 1);
我首先使用了一些join语句来获得一个表格,其中列出了这两位演员主演的所有电影片名 我通过按电影标题分组来清理数据,这将相似的电影标题分组 然后我使用COUNT函数查看电影标题在哪里被提到两次,这意味着两个演员都参与其中
-- inspired by https://stackoverflow.com/a/477035
SELECT movies.title FROM stars
JOIN movies ON stars.movie_id = movies.id
JOIN people ON stars.person_id = people.id
WHERE people.name IN ('Johnny Depp', 'Helena Bonham Carter')
GROUP BY movies.title
HAVING COUNT(movies.title) = 2;
我在这里测试了所有建议,我相信这是迄今为止最快的一个,尽管它似乎有点神秘: 时间:0.48
SELECT title FROM movies WHERE id IN
(
SELECT movie_id FROM stars WHERE person_id =
(SELECT id FROM people WHERE name = "Helena Bonham Carter")
and
movie_id IN
(
SELECT movie_id FROM stars WHERE person_id =
(SELECT id FROM people WHERE name = "Johnny Depp")
)
)
你得到的结果集是由约翰尼·德普或HBC主演的电影列表
将表、电影
加入明星
加入人物
,这比嵌套的WHERE
子句要高效得多,然后看看WHERE EXISTS
而不是WHERE IN
,因为你必须满足两个条件。@EricBrandt感谢你的回答。在您和更多google搜索的帮助下,我想到了在SQL中使用HAVING
子句。(虽然我还没有想出解决方案。)我之所以使用WHERE IN
是因为没有具有两个值(例如“JD”和“HBC”)的表单元格。因此,我认为正确的方法是选择一个包含“JD”或“JBC”的表格单元格,然后计算电影总数。然而,我的错误是没有确保那些电影同时由JD和JBC主演。这对你有意义吗?谢谢,是的,我也使用了INTERSECT。欢迎来到StackOverflow。虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
SELECT title FROM movies WHERE id IN
(
SELECT movie_id FROM stars WHERE person_id =
(SELECT id FROM people WHERE name = "Helena Bonham Carter")
and
movie_id IN
(
SELECT movie_id FROM stars WHERE person_id =
(SELECT id FROM people WHERE name = "Johnny Depp")
)
)