具有此数据库模型:
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))
我想执行以下查询,但是我不知道如何添加“其中所有演员以字母A开头的部分”。
从IMDB得分排序的所有电影中,选择所有演员以字母A开头并已筹集超过6,000万美元(总收入)的电影,选择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;
答案 0 :(得分:0)
“演员姓名以字母A开头”是:a.name LIKE 'A%'
。
“电影中的所有演员都以字母A开头”有点棘手。让我从远处开始。
您查询的外观漂亮,但我必须做一些小注释:
HAVING COUNT(*) > 1
。就您而言,您可以在WHERE中轻松移动imdb_score。可能的实现方式之一是:
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(真)或0(假),因此这种方式我们可以计算满足一定条件的参与者数量,而COUNT(*)是无条件计数。我们可以对它们进行比较以获得技巧。
答案 1 :(得分:0)
请考虑以下内容...
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 |
+----------+