mysql - 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.year
与select year from movie where movie.year != movie.year
但结果是“钢铁侠”,我不明白我错过了什么。
解决方案
您当前的查询不是最理想的。您应该使用显式连接重写它,在这种情况下,显式自连接:
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);
推荐阅读
- hyperledger-fabric - 使用 Hyperledger Fabric 节点 SDK 开发 UI
- azure - 如何让 NvidiaDeepstreamSDK iotedge 模块在 jetson nano 上工作?
- regex - 多语言名称的正则表达式
- python - 查找 n 个元素的所有 k 个组合长度
- ibm-integration-bus - IBM App Connect Enterprise - 休息请求节点中的表单数据
- javascript - 如何在单击 javascript 中的按钮时触发此代码
- javascript - 删除一组 json 中的 json 值
- ios - CoreData context returns nil after setting it up
- python - 如何在 3 维中一起过滤图像
- java - 蒙面的EditText不工作android工作室