Pourquoi mon script SQL sélectionne-t-il trop de sorties (CS50 pset7 sql.13) ?

Aug 19 2020

Je travaille actuellement sur pset7 dans cs50, et je pensais avoir sélectionné le bon nombre de valeurs spécifiées, mais mon script affiche 349 lignes au lieu des 176 de la clé de réponse.

"Dans 13.sql, écrivez une requête SQL pour répertorier les noms de toutes les personnes qui ont joué dans un film dans lequel Kevin Bacon a également joué. Votre requête doit générer un tableau avec une seule colonne pour le nom de chaque personne. Il peut y avoir plusieurs personnes nommées Kevin Bacon dans la base de données. Assurez-vous de ne sélectionner que le Kevin Bacon né en 1958. Kevin Bacon lui-même ne devrait pas être inclus dans la liste résultante.

CS50 pset7 sql.13

sqlite> .schema
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)
            );

MON SCRIPT

SELECT DISTINCT name

FROM 
    people
    INNER JOIN  stars ON people.id = stars.person_id
    INNER JOIN movies ON movies.id = stars.movie_id

WHERE movies.title IN (

SELECT
    title
    
From
    movies
    INNER JOIN stars ON movies.id = stars.movie_id
    INNER JOIN people ON stars.person_id= people.id
    
WHERE 
    people.name = "Kevin Bacon"
    AND
    people.birth = "1958"
    )
    
EXCEPT SELECT name FROM people WHERE people.name = "Kevin Bacon"

Y a-t-il des erreurs logiques dans ce script ? Ma logique était :

  • Sélectionnez tous les films dans lesquels Kevin Bacon joue (SELECT imbriqué)
  • Sélectionnez les noms des stars (principal SELECT) qui apparaissent dans l'un de ces films de Kevin Bacon, à l'exception de Kevin Bacon lui-même.

Réponses

Isolated Aug 19 2020 at 02:49

Quelque chose comme ça fonctionnerait dans postgres. Il peut être nécessaire de s'adapter à votre base de données.

    select name
    from (
        with kb_movies as
            (select distinct movies.id as kb_movie_id
            from movies
            join stars 
                on stars.movie_id = movies.id
            join people 
                on people.id = stars.people_id
            where people.name = 'Kevin Bacon'
            and people.birth = '1958' --or 1958
            )
            select distinct people.name
            from people
            join stars 
                on stars.people_id = people.id
            join movies 
                on movies.id = stars.movie_id
            join kb_movies 
                on kb_movie_id = movies.id
        )z
    where name <> 'Kevin Bacon'