2017-08-03 55 views
0

我有一個電影Postgres數據庫,我想高效地列出演員演奏的所有電影,並列出所有電影中的演員。如何根據Postgres中的外鍵選擇數據?

目前我使用這兩個SELECT語句 (我bileive有更好的方式來做到這一點):

SELECT title FROM movies,castings WHERE movies.id = castings.movieid and castings.actorid = (SELECT id FROM actors where name = $name and sname = $sname); 

SELECT name, sname FROM actors,castings WHERE actors.id = castings.actorid and castings.movieid = (SELECT id FROM movies where title = $title); 

數據庫:

CREATE SEQUENCE directors_id_seq; 
CREATE TABLE directors (
    id BIGINT PRIMARY KEY DEFAULT nextval('directors_id_seq'), 
    name TEXT, 
    sname TEXT 
); 

CREATE SEQUENCE actors_id_seq; 
CREATE TABLE actors (
    id BIGINT PRIMARY KEY DEFAULT nextval('actors_id_seq'), 
    name TEXT, 
    sname TEXT 
); 

CREATE SEQUENCE movies_id_seq; 
CREATE TABLE movies (
    id BIGINT PRIMARY KEY DEFAULT nextval('movies_id_seq'), 
    title TEXT NOT NULL, 
    year INT NOT NULL, 
    votes INT, 
    score INT, 
    director BIGINT NOT NULL REFERENCES directors (id) 
); 

CREATE TABLE castings (
    movieid BIGINT REFERENCES movies (id), 
    actorid BIGINT REFERENCES actors (id), 
    ord INT, 
    PRIMARY KEY (movieid, actorid) 
); 

我怎麼能列出所有電影由演員演奏? 如何列出在電影中播放的所有演員?

- 謝謝,

回答

0

這應做到:

由演員

SELECT M.* 
FROM movies M 
INNER JOIN castings C ON C.movieid = M.id 
INNER JOIN actors A ON A.id = C.actorid 
WHERE A.name = $name 
AND A.sname = $sname 

所有演員在一部電影扮演發揮所有的電影

SELECT A.* 
FROM actors A 
INNER JOIN castings C ON C.actorid = A.id 
INNER JOIN movies M ON M.id = C.movieid 
WHERE M.title = $title 
+0

這工作,看起來更好!謝謝! – hythm