2016-03-20 2 views
1

Мне нужен запрос, чтобы найти фильм с изображением как Keira Knightly и Carey Mulligan.Базовый SQL Query & Table Improvement?

У меня был кто-то другой, выполняющий проект со мной, делали запросы на созданной мной таблице, но я не думаю, что они верны, поэтому я хотел бы знать правильный способ выполнения запроса Я знаю для справок в будущем.

Вот таблица:

drop table film_director; 
drop table film_actor; 
drop table film; 
drop table studio; 
drop table actor; 
drop table director; 

CREATE TABLE studio(
studio_ID NUMBER NOT NULL, 
studio_Name VARCHAR2(30), 
PRIMARY KEY(studio_ID)); 

CREATE TABLE film(
film_ID NUMBER NOT NULL, 
studio_ID NUMBER NOT NULL, 
genre VARCHAR2(30), 
genre_ID NUMBER(1), 
film_Len NUMBER(3), 
film_Title VARCHAR2(30) NOT NULL, 
year_Released NUMBER NOT NULL, 
PRIMARY KEY(film_ID), 
FOREIGN KEY (studio_ID) REFERENCES studio); 

CREATE TABLE director(
director_ID NUMBER NOT NULL, 
director_fname VARCHAR2(30), 
director_lname VARCHAR2(30), 
PRIMARY KEY(director_ID)); 

CREATE TABLE actor(
actor_ID NUMBER NOT NULL, 
actor_fname VARCHAR2(15), 
actor_lname VARCHAR2(15), 
PRIMARY KEY(actor_ID)); 

CREATE TABLE film_actor(
film_ID NUMBER NOT NULL, 
actor_ID NUMBER NOT NULL, 
PRIMARY KEY(film_ID, actor_ID), 
FOREIGN KEY(film_ID) REFERENCES film(film_ID), 
FOREIGN KEY(actor_ID) REFERENCES actor(actor_ID)); 

CREATE TABLE film_director(
film_ID NUMBER NOT NULL, 
director_ID NUMBER NOT NULL, 
PRIMARY KEY(film_ID, director_ID), 
FOREIGN KEY(film_ID) REFERENCES film(film_ID), 
FOREIGN KEY(director_ID) REFERENCES director(director_ID)); 

INSERT INTO studio (studio_ID, studio_Name) VALUES (1, 'Paramount'); 
INSERT INTO studio (studio_ID, studio_Name) VALUES (2, 'Warner Bros'); 
INSERT INTO studio (studio_ID, studio_Name) VALUES (3, 'Film4'); 
INSERT INTO studio (studio_ID, studio_Name) VALUES (4, 'Working Title Films'); 

INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (1, 1, 'Comedy', 1, 180, 'The Wolf Of Wall Street', 2013); 
INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (2, 2, 'Romance', 2, 143, 'The Great Gatsby', 2013); 
INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (3, 3, 'Science Fiction', 3, 103, 'Never Let Me Go', 2008); 
INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (4, 4, 'Romance', 4, 127, 'Pride and Prejudice', 2005); 

INSERT INTO director (director_ID, director_fname, director_lname) VALUES (1, 'Martin', 'Scorcese'); 
INSERT INTO director (director_ID, director_fname, director_lname) VALUES (2, 'Baz', 'Luhrmann'); 
INSERT INTO director (director_ID, director_fname, director_lname) VALUES (3, 'Mark', 'Romanek'); 
INSERT INTO director (director_ID, director_fname, director_lname) VALUES (4, 'Joe', 'Wright'); 

INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (1, 'Matthew', 'McConnaughy'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (2, 'Leonardo', 'DiCaprio'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (3, 'Margot', 'Robbie'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (4, 'Joanna', 'Lumley'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (5, 'Carey', 'Mulligan'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (6, 'Tobey', 'Maguire'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (7, 'Joel', 'Edgerton'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (8, 'Keira', 'Knightly'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (9, 'Andrew', 'Garfield'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (10, 'Sally', 'Hawkins'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (11, 'Judi', 'Dench'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (12, 'Matthew', 'Macfadyen'); 

INSERT INTO film_actor (film_ID, actor_ID) VALUES (1, 1); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (1, 2); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (1, 3); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (1, 4); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (2, 2); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (2, 5); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (2, 6); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (2, 7); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (3, 5); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (3, 8); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (3, 9); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (3, 10); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (4, 5); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (4, 8); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (4, 11); 
INSERT INTO film_actor (film_ID, actor_ID) VALUES (4, 12); 

INSERT INTO film_director (film_ID, director_ID) VALUES (1,1); 
INSERT INTO film_director (film_ID, director_ID) VALUES (2,2); 
INSERT INTO film_director (film_ID, director_ID) VALUES (3,3); 
INSERT INTO film_director (film_ID, director_ID) VALUES (4,4); 

ответ

2

Ваш запрос действительно возвращает правильные результаты? Сомневаюсь .. Вы можете использовать EXISTS():

SELECT f.film_title AS "Mulligan and Knightly" 
FROM Film f 
INNER JOIN film_actor x 
ON(f.film_id = x.film_id) 
INNER JOIN actor a 
ON(x.actor_id = a.actor_id) 
WHERE a.actor_id = 8 
     AND EXISTS(select 1 FROM film_actor s 
       where s.film_id = x.film_id 
        and s.actor_id = 5) 

Это также может быть сделано с простой группой по и имеющей п:

SELECT f.film_title AS "Mulligan and Knightly" 
FROM Film f 
INNER JOIN film_actor x 
ON(x.film_id = f.film_id) 
WHERE x.actor_id in(5,8) 
GROUP BY f.film_title 
HAVING COUNT(*) = 2 
+0

Это вернуло правильные результаты, но я отправил парня в свою группу для этого проекта, и он сделал это, но это не показалось правильным, и решил, что это намного лучший способ сделать это. – Poena

+0

Нет проблем :) @ Jordan5497 – sagi

1

Возможно, что-то, как это будет делать?

select f.filmTitle as 'mulligan and knightly' from film f inner join film_actor fa on f.film_id = fa.film_id inner join actor a on fa.actor_id = a.actor_id where a.actor_lname = 'Knightley' 
    intersect 
    select f.filmTitle as 'mulligan and knightly' from film f inner join film_actor fa on f.film_id = fa.film_id inner join actor a on fa.actor_id = a.actor_id where a.actor_lname = 'Mulligan' 
1

Вы можете присоединиться таблицы для себя, как показано ниже. В этом примере я предполагаю, что вы знаете идентификаторы участников. Если вы хотите сохранить поиск по имени, вы снова присоединитесь к актеру дважды.

--keira == 8. carey == 5. 
select f1.film_Title as Both_In 
from 
    film_actor fa1 
    inner join film f1 on f1.film_ID = fa1.film_ID 
    inner join film_actor fa2 on fa2.actor_ID = 5 and fa2.film_ID = fa1.film_ID 
where fa1.actor_ID = 8 
+1

@ Jordan5497 Да, это возвращает правильные результаты на моей машине и выглядит правильно. – JosephStyons