cs50 pset7电影sql.12

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

有人能帮我修复SQL吗? 我在处理五张桌子。
预期结果是,

  • “编写SQL查询以列出所有电影的标题,其中 约翰尼·德普和海伦娜·邦汉·卡特主演“
  • 您的查询应该输出一个表,其中每个电影的标题只有一列。
  • 您可以假设数据库中只有一个人 我叫约翰尼·德普
  • 你可以假设数据库中只有一个人名叫海伦娜·邦汉·卡特

  • 这将产生59行,其中应该只有6行

     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")
                )
    )