ВОПРОС РЕШЕНИЕ - PullRequest
       4

ВОПРОС РЕШЕНИЕ

0 голосов
/ 01 марта 2020

Имея эту модель базы данных:

Movie(id_movie, title, id_director(FK), year, duration, country, facebook_likes, imbued_score, gross, budget)

Actor_Movie(id_actor(FK),id_movie(FK))

Person(id_person, name, facebook_likes)

Actor(id_actor(FK))

Director(id_director(FK))

Genre(id_genre,description)

Genre_Movie(id_genre(FK),id_movie(FK))

Producer(id_producer, name, country)

Producer_Movie(id_producer(FK), id_movie(FK))

Language(id_language,language)

Language_Movie(id_language(FK), id_movie(FK))

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

Выберите название IMDB и отметьте из тех фильмов, где все актеры в нем начинаются с буквы A и собрали более 60 миллионов долларов (брутто), согласно порядку счета IMDB.

Это что имею до сих пор:

select m.title
     , m.imdb_score
  from movie as m
     , actor as a
     , actor_movie as am
     , person as p
 where p.id_person = a.id_actor 
   and a.id_actor = am.id_actor 
   and am.id_movie = m.id_movie 
 group 
    by m.title
     , m.imdb_score
having m.imdb_score > 6.0 
 order 
    by m.imdb_score DESC;

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Рассмотрим следующее ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(movie_id INT NOT NULL, actor VARCHAR(12) NOT NULL,PRIMARY KEY(movie_id,actor));

INSERT INTO my_table VALUES (1,'alan'),(1,'angela'),(1,'albert'),(1,'annie');
INSERT INTO my_table VALUES (2,'alan'),(2,'alice'),(2,'arnold'),(2,'barbara');

SELECT * FROM my_table;
+----------+---------+
| movie_id | actor   |
+----------+---------+
|        1 | alan    |
|        1 | albert  |
|        1 | angela  |
|        1 | annie   |
|        2 | alan    |
|        2 | alice   |
|        2 | arnold  |
|        2 | barbara |
+----------+---------+

SELECT DISTINCT a.movie_id  
           FROM my_table a 
           LEFT 
           JOIN my_table b   
             ON b.movie_id = a.movie_id 
            AND b.actor NOT LIKE 'a%' 
           WHERE b.movie_id IS NULL;
+----------+
| movie_id |
+----------+
|        1 |
+----------+
0 голосов
/ 01 марта 2020

«Имя актера, начинающееся с буквы А»: a.name LIKE 'A%'.
«Все актеры в мове ie, начинающиеся с буквы А», немного сложно. Позвольте мне начать издалека.

Ваш запрос выглядит неплохо, но я должен сделать несколько незначительных замечаний:

  • Обычно переводить отношения в предложения JOIN и оставлять WHERE для всех остальных условие;
  • Предложение HAVING используется для условия после группировки, которое НЕ применимо в предложении WHERE. Нечто подобное: HAVING COUNT(*) > 1. В вашем случае вы можете легко перемещать imdb_score внутри WHERE.

Одна из возможных реализаций:

SELECT
    m.title,
    m.imdb_score 
FROM movie AS m 
JOIN actor_movie AS am ON am.id_movie = m.id_movie 
JOIN actor AS a ON a.id_actor = am.id_actor 
JOIN person AS p ON p.id_person = a.id_actor
WHERE m.imdb_score > 6.0 
AND m.gross > 60000000
GROUP BY
    m.title,
    m.imdb_score 
HAVING COUNT(*) = SUM(a.name LIKE 'A%')
ORDER BY m.imdb_score DESC

Логическое выражение внутри SUM () дает 1 (true) или 0 (false), таким образом, мы можем подсчитать количество акторов, удовлетворяющих некоторому условию, в то время как COUNT (*) - это безусловный счет. Мы можем сравнить их, чтобы получить трюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...