1050-合作过至少三次的演员和导演
合作过至少三次的演员和导演
- 题目如下所示
个人题解
这道题,主要考察的是分组思想。我个人的思考过程如下所示
-
-- 1. 建表 CREATE TABLE 1050_ActorDirector( actor_id INT, director_id INT, timestamp INT, PRIMARY KEY(timestamp) ); -- 2. 写一条 SQL 查询语句获取合作过至少三次的演员和导演的 id 对(actor_id, director_id) SELECT ad.actor_id, ad.director_id FROM 1050_ActorDirector ad GROUP BY ad.actor_id, ad.director_id HAVING COUNT(*) >= 3; -- 我想的是在 MySQL 当中,碰到统计的问题一般都会使用到分组,所以分组肯定跑不掉 -- 然后呢,我想着分一列的话,好像也不对啊,所以鬼使神差的我就想分两列试试看,然后分两列,用 COUNT 函数的时候没办法指定一列,干脆就用 * 号代替了 -- 诶,结果还真对了,我去.... -- 接下来我们探究一下其中的具体原理吧(即 GROUP BY 分组的原理) -- 我们以后要看分组当中具体做了什么操作,我们可以直接使用 GROUP_CONCAT(expr) 方法来进行分析,GROUP_CONCAT() 函数会把每个分组的字段值都显示出来。 SELECT ad.actor_id, ad.director_id, GROUP_CONCAT(ad.actor_id), GROUP_CONCAT(ad.director_id), GROUP_CONCAT(ad.timestamp) FROM 1050_ActorDirector ad GROUP BY ad.actor_id, ad.director_id; -- 看了上述查询结果,是否对 GROUP BY 有那么一点点的理解了呢? -- 实际上,就拿这题来举例子,我对分组多列最开始的疑惑是:如果对 actor_id 进行分组之后,会把相同的分到一组,而对 director_id 分组之后也会把相同的id分到一组 -- 那么对这两列一起分组的时候,他们是怎么对应上的?就是说为什么 actor_id 为 1 的没全部分到一组,而是跟 director_id 一起去了呢? -- 我们找一张单表来试试 CREATE TABLE 1050_groupbytest( test_id INT, unknown_id INT, name VARCHAR(10) ); -- 随便插几条数据,如下所示 /* 1 1 abc 1 2 njk 2 1 olk 3 4 lll 4 5 000 5 6 aaaa */ -- 我们现在随便分一组, 如分 test_id 吧,然后用 GROUP_CONCAT(expr) 拼接 查看所有字段分的情况 SELECT GROUP_CONCAT(t.test_id), GROUP_CONCAT(t.unknown_id), GROUP_CONCAT(t.name) FROM 1050_groupbytest t GROUP BY t.test_id; -- 根据查询结果我们得知,分一列的情况下,是不管其他没分的列情况如何的,只要分的字段相同那么就做类似 concat 的操作 -- 那么,分两列呢?试一试 SELECT GROUP_CONCAT(t.test_id), GROUP_CONCAT(t.unknown_id), GROUP_CONCAT(t.name) FROM 1050_groupbytest t GROUP BY t.test_id, t.unknown_id; -- haha,我还是看不太出来,总感觉欠缺了点什么。 -- 不过在网上百度到了有个大佬的博客说的如下: -- GROUP BY X, Y 意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里 -- 慢慢咀嚼,相同的字段值放到一个分组里!! -- 可以想象一下,有一个桶,在查询之前是空的,查询的时候遍历表中的每一行数据,如果 分组分的是一列,那么第一行的那一列值,就作为一个分组,丢到那个桶里,然后遍历第二行数据, -- 如果第二行数据中被分组的列跟桶里的那个分组中的列值相等,那么也就可以丢到那个桶里的那个分组当中去! -- 那么同理,刚才是分一列,那么分两列,还是一样的遍历第一行数据,把两列值作为一个分组,丢到桶里,然后遍历第二行数据,看一下两列值是否符合桶中的任何一组分组,符合就 加进去 咯!ok,我已经略微勉强理解到了一丢丢 GROUP BY 的精髓,就此打住,以后碰到再说 -- 当然上面有点啰嗦了,存粹个人的粗浅理解,望见谅!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-07-11 05-Nacos注册中心
2022-07-11 04-Ribbon负载均衡
2022-07-11 03-Eureka注册中心
2022-07-11 02-服务拆分和远程调用
2022-07-11 01-微服务的概念