mysql - MySQL - 连接和之间
问题描述
列出所有在 1950 年代和 1980 年代制作电影的演员。
当我专门尝试时:
SELECT a.name
FROM movies AS m
JOIN castings AS c
JOIN actors AS a
ON m.id = c.movieid
AND c.actorid = a.id
WHERE (m.yr BETWEEN 1950 AND 1959)
或者:
SELECT a.name
FROM movies AS m
JOIN castings AS c
JOIN actors AS a
ON m.id = c.movieid
AND c.actorid = a.id
WHERE (m.yr BETWEEN 1980 AND 1989)
我得到了两个单独查询的结果。但是,当我结合这些时,我没有得到任何行。
SELECT a.name
FROM movies AS m1
JOIN movies AS m2
JOIN castings AS c
JOIN actors AS a
ON m1.id = c.movieid
AND m2.id = c.movieid
AND c.actorid = a.id
AND m1.id < m2.id
WHERE (m1.yr BETWEEN 1950 AND 1959) AND (m2.yr BETWEEN 1980 AND 1989);
我怎样才能找到我正在寻找的名字?
解决方案
从您现有的查询开始,一种直接的方法是使用聚合,并使用HAVING
子句进行过滤:
SELECT a.name
FROM movies AS m
JOIN castings AS c ON m.id = c.movieid
JOIN actors AS a ON c.actorid = a.id
GROUP BY a.id, a.name
HAVING
MAX(m.yr BETWEEN 1950 AND 1959) = 1
AND MAX(m.yr BETWEEN 1980 AND 1989) = 1
推荐阅读
- java - Java - 地图
> 遍历列表并跳过前 N 个条目 - pos-tagger - POS/NER 能够区分在多个上下文中使用的同一个词吗?
- php - 如何反序列化,然后将生成的多维数组转换为纯文本,去掉代码?
- azure - 将 Azure Sql 数据库限制为只能从不同区域的某些 Azure 应用服务访问
- python - 如何在 Pandas 中更改 MultiIndex 数据框列中某些行的值
- python - 使用 PySimpleGUI 时如何启用并响应最大化按钮
- vue.js - Vuetify:尽管 v-model 变量设置为 false,但 v-dialog 不会关闭
- c++ - 错误 LNK2005 DllMain 已在 uafxcw.lib(dllmodul.obj) 中定义
- javascript - 如何在 javascript 中为 ("1:2,2.2,3:4,4.1,5") 制作正则表达式?
- asp.net - 如何在 ASP.NET Core 的不同位置使用视图组件的视图?