简体   繁体   English

cs50 pset7 电影 sql.12

[英]cs50 pset7 Movies sql.12

Could someone help me with how to approach fixing my SQL?有人可以帮我解决如何修复我的 SQL 吗? I am handling five tables.我正在处理五张桌子。
The expected results are,预期的结果是,

  1. "write a SQL query to list the titles of all movies in which both Johnny Depp and Helena Bonham Carter starred" “写一个 SQL 查询来列出约翰尼·德普和海伦娜·伯翰·卡特主演的所有电影的标题”
  2. Your query should output a table with a single column for the title of each movie.您的查询应该 output 一个表,其中每部电影的标题只有一列。
  3. You may assume that there is only one person in the database with the name Johnny Depp.您可以假设数据库中只有一个名为 Johnny Depp 的人。
  4. You may assume that there is only one person in the database with the name Helena Bonham Carter.您可以假设数据库中只有一个名为 Helena Bonham Carter 的人。

     CREATE TABLE movies ( id INTEGER, title TEXT NOT NULL, year NUMERIC, PRIMARY KEY(id) ); CREATE TABLE stars ( movie_id INTEGER NOT NULL, person_id INTEGER NOT NULL, FOREIGN KEY(movie_id) REFERENCES movies(id), FOREIGN KEY(person_id) REFERENCES people(id) ); CREATE TABLE directors ( movie_id INTEGER NOT NULL, person_id INTEGER NOT NULL, FOREIGN KEY(movie_id) REFERENCES movies(id), FOREIGN KEY(person_id) REFERENCES people(id) ); CREATE TABLE ratings ( movie_id INTEGER NOT NULL, rating REAL NOT NULL, votes INTEGER NOT NULL, FOREIGN KEY(movie_id) REFERENCES movies(id) ); CREATE TABLE people ( id INTEGER, name TEXT NOT NULL, birth NUMERIC, PRIMARY KEY(id) );

This results in 59 rows, where it is supposed to be only 6 rows.这会产生 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")));

I see other posts talking about using "WHERE IN" would be helpful, and I am indeed using it.我看到其他谈论使用“WHERE IN”的帖子会有所帮助,而且我确实在使用它。

I used like below and it was a little bit faster than using INTERSECT .我像下面这样使用它,它比使用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

I first used a few join statements to get a table where I have all the movie titles where these two actors were starred in.我首先使用了一些连接语句来获得一个表格,其中包含了这两位演员出演的所有电影片名。

I cleaned up the data by grouping by movie title, which groups similar movie titles.我通过按电影标题分组来清理数据,将相似的电影标题分组。

I then used the COUNT function to see where the movie title was mentioned twice, which would mean both actors were involved.然后我使用 COUNT function 来查看两次提到电影标题的位置,这意味着两个演员都参与了。

-- 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;

Using JOIN and INTERSECT helped me solve this one.使用JOININTERSECT帮助我解决了这个问题。

Something like this:像这样的东西:

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

Using count:使用计数:

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

I have tested all recommendation here, and I believed this is the fastest one until now, although it seems little cryptic:我已经在这里测试了所有推荐,我相信这是迄今为止最快的,虽然它看起来有点神秘:

Time: 0.48时间: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")
            )
)

In this case, I did not use JOIN option, and more as the traditional style in order to get it better in my mind.在这种情况下,我没有使用 JOIN 选项,而是更多地作为传统样式,以便更好地记住它。 I ll still try another way.我还是会尝试另一种方式。 But this option worked fine.但是这个选项效果很好。

SELECT movies.title FROM movies
WHERE id IN (SELECT movie_id FROM stars WHERE person_id IN
(SELECT id FROM people WHERE name = "Johnny Depp"))
AND id IN (SELECT movie_id FROM stars WHERE person_id IN
(SELECT id FROM people WHERE name = "Helena Bonham Carter"));

I used INTERSECT我用了相交

SELECT title FROM people JOIN stars ON people.id = stars.person_id JOIN movies ON stars.movie_id = movies.id WHERE name = "Johnny Depp" INTERSECT SELECT title FROM people JOIN stars ON people.id = stars.person_id JOIN movies ON stars.movie_id = movies.id WHERE name = "Helena Bonham Carter"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM