【问题标题】:How to exclude some data on a SQL query depending on it's different values?如何根据不同的值排除 SQL 查询中的某些数据?
【发布时间】:2020-06-04 22:46:45
【问题描述】:

我有以下 2 个表:

create table Director (

    id_director int,
    name varchar(255),
    primary key (id_director)
);

create table Movies (

    id_movie int,
    id_director int,
    title varchar(255),
    year int,
    primary key (id_movie),
    foreign key (id_director) references Director (id_director)
);

已在此表中插入了一些数据。想象一下数据是:

表导演

id_director       name
-------------------------
   1               Charles
   2               Jack
   3               Katia
   4               David

桌面电影

id_movie      id_director     title        year
------------------------------------------------
   1              2            title1      1999
   2              1            title2      2011
   3              1            title3      2019
   4              3            title4      2019
   5              4            title5      1968
   6              3            title6      2020
   7              2            title7      1977
   8              4            title8      2004
   9              1            title9      2020

我想执行 SELECT 子句,以过滤导演认为它是 2019 年以来的第一部电影。请注意示例中只有 id_director = 3 的导演符合要求,因为他制作了 2 部电影,其中一部2019 年,另一个是 2020 年。

我该怎么做?

我想得到的输出是:

id_director          name
------------------------------
    3                Katia

这个我试过了,但是很明显是错的,因为有些directors在2019年之前拍过电影,2019年以后也拍过。

select director.id_director, director.name from director, movies
where director.id_director = movie.id_director and year = 2019
group by (name);

我正在使用 MySQL,我想我可以使用 IN / NOT IN 子查询来做到这一点(但是如何)?

【问题讨论】:

  • 标记您正在使用的 DBMS。

标签: mysql sql select filter


【解决方案1】:

您可以使用相关子查询:

select d.*
from director d  
where 2019 = (select min(m.year) from movies m where m.id_director = d.id_director);

【讨论】:

    【解决方案2】:

    如果我理解正确,您想查看该导演的最小(年)。所以 SQL 应该是这样的:

    select * from movies m
    inner join directors d on m.id_director = d.id_director
    where min(m.year) = 2019
    group by d.id_director;
    

    【讨论】:

    • 这行得通,谢谢。这样做而不是像其他答案那样做子查询有什么区别吗?
    • 它可能比子查询更有效。
    【解决方案3】:

    dbfiddle

    SELECT id_director, name
    FROM Director
    WHERE 2019 = (SELECT MIN(year) 
                  FROM Movies 
                  WHERE Movies.id_director=Director.id_director);
    

    【讨论】:

      【解决方案4】:

      试试这个查询

      select d.id_director,d.name from director d
      inner join movies m on
      d.id_director=m.id_director
      group by d.name,d.id_director
      having min(m.year)>=2019;
      

      最好的问候,

      法比亚诺庞特斯

      【讨论】:

      • 可以查询,但是,您能解释一下吗?这个查询的“关键点”是什么?
      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多