sql - 有没有更简单的方法来找出查询
问题描述
我有一个电影表,其中包含年份和电影详细信息,例如标题、电影 id(mid) 和一个表 m_cast,其中包含该电影中的所有演员。
我想请所有从未失业超过3年的演员。(假设演员在连续两部电影之间失业)
我想出的代码是
select a.yr1 y1 , b.yr2 y2 , a.yr1 - b.yr2 diff from
(select substr(substr(trim(year),-5),0,5) yr1 , * from movie m inner join m_cast p on m.mid = p.mid order by pid , yr1) a ,
(select substr(substr(trim(year),-5),0,5) yr2 , * from movie m inner join m_cast p on m.mid = p.mid order by pid, yr2) b on a.yr1 > b.yr2
where not exists
(select count(*) from movie m inner join m_cast p on m.mid = p.mid
and cast(substr(substr(trim(year),-5),0,5) as integer) < a.yr1 and cast(substr(substr(trim(year),-5),0,5) as integer) > b.yr2)
自加入本身需要很多时间。并且滞后和领先功能在我使用的 SQLite 版本中不起作用。
解决方案
我假设电影表有一个名为 year 的列,以及一个标识演员姓名的列。类似于:年份 int,actorId int
运行查询的最快方法是从电影表中过滤过去 3 年,然后按演员对不同的年数进行分组。
过滤 ActorId 后的示例 Year 1. 2018 1. 2018 1. 2017 2. 2016 2. 2017 2. 2018
然后分组并选择 distinct :从具有 count (distinct (Year)) =3 的 actorId 从 movieTable 组中选择 actorId
这只会归还过去 3 年工作过的演员。一旦您在该列中过滤掉了您的演员 ID,请连接到包含他们姓名的表。
对不起我写作的格式——是用我的手机写的。
问候,豪尔赫·D·洛佩兹
推荐阅读
- asp.net-core - Startup.cs 中的 IConfiguration
- optimization - LLVM 不可变通行证
- javascript - Autodesk Forge Viewer,搜索功能不起作用
- airflow - 有没有办法让 3 组工作节点(组)用于气流
- c# - 打开文件夹中的所有word文档并替换word。此应用程序在打开 5 个文档后卡住
- php - 如何制作 where 语句 = 一个 php 会话变量
- amazon-web-services - 在解码 JWT 时,从 AWS 机密管理器中检索机密会导致问题
- expo - 使用 expo branch.io SDK 和广告合作伙伴链接安装归因
- admin - 为什么我不能成为 Telegram 的管理员?
- react-navigation - 在navigation.goback() 之后需要返回吗?