1050-合作过至少三次的演员和导演

合作过至少三次的演员和导演

原文地址:1050. 合作过至少三次的演员和导演 - 力扣(LeetCode)

  • 题目如下所示

个人题解

这道题,主要考察的是分组思想。我个人的思考过程如下所示

  • -- 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 的精髓,就此打住,以后碰到再说
    -- 当然上面有点啰嗦了,存粹个人的粗浅理解,望见谅!!
posted @   OnlyOnYourself-Lzw  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 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-微服务的概念
点击右上角即可分享
微信分享提示