首页 > 解决方案 > mysql - 为什么这个关于 WHERE 子句的子查询有效?

问题描述

我的电影桌在这里,

title        year length incolor studioName producerC#

Avengers        2012    142 1   Marvel      12345
First Avenger   2011    123 1   Marvel      38664 
Justice League  2017    121 1   DC          11223 
Man of Steel    1925    142 1   DC          38664 
Man of Steel    2013    142 1   DC          11223 
Ted             2012    106 1   Universal   87654 
Toy Story 3     2010    102 1   Pixar       23456

我想找到“已用于两部电影或更多电影的标题。”</p>

答案是“钢铁侠”,因为这部电影的年份是 1925 年,2013 年,所以它使用了两次。

我的查询就在这里。

select distinct movie.title 
from movie, (select * from movie) as temp
where temp.title = movie.title 
    AND (temp.year != movie.year OR temp.length != movie.length OR temp.studioName != movie.studioName);

作为尊重,结果是Man of Steel我想要的。

但我不明白温度,电影的区别。

两个表都有完全相同的值,所以temp.title = movie.title应该是select title from movie;

并且temp.year != movie.year应该为空,因为temp.year != movie.yearselect year from movie where movie.year != movie.year

但结果是“钢铁侠”,我不明白我错过了什么。

标签: mysqlsql

解决方案


您当前的查询不是最理想的。您应该使用显式连接重写它,在这种情况下,显式自连接:

SELECT DISTINCT
    m1.title
FROM movie m1
INNER JOIN movie m2
    ON m1.title = m2.title
WHERE
    m1.year <> m2.year OR m1.length <> m2.length OR m1.studioName <> m2.studioName;

这里的逻辑是考虑每对具有相同标题但共享年份、长度或工作室名称的电影。也就是说,查找所有电影标题,使得存在具有相同标题的另一部电影,但一个或多个其他字段不同。

还有另一种使用按电影标题聚合来编写查询的方法:

SELECT title
FROM movie
GROUP BY title
HAVING
    MIN(year) <> MAX(year) OR
    MIN(length) <> MAX(length) OR
    MIN(studioName) <> MAX(studioName);

推荐阅读