mysql-为什么此WHERE子句上的子查询有效?

时间:2019-04-02 05:12:58

标签: mysql sql

我的电影桌在这里

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

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

答案是“钢铁侠”,因为这部电影的年份是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相同

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

2 个答案:

答案 0 :(得分:3)

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

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);

答案 1 :(得分:2)

在您的查询中,“温度”和“电影”都是完全相同的表,并且用其他术语SELF JOIN进行联接的目的是匹配两个电影标题,而另一个特征中的至少一个不同则可以是“年份”,长度或工作室名称。这就是为什么在WHERE语句中以OR条件给出不相等的符号的原因。