查询解决方案

时间:2020-03-01 09:40:45

标签: mysql database

具有此数据库模型:

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;

2 个答案:

答案 0 :(得分:0)

“演员姓名以字母A开头”是:a.name LIKE 'A%'
“电影中的所有演员都以字母A开头”有点棘手。让我从远处开始。

您查询的外观漂亮,但我必须做一些小注释:

  • 通常将关系移到JOIN子句中,并在所有其他条件下都离开WHERE;
  • HAVING子句用于分组后条件,该条件不适用于WHERE子句。诸如此类: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 |
+----------+