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

发布时间 2023-07-11 15:27:41作者: OnlyOnYourself-Lzw

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

原文地址: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 的精髓,就此打住,以后碰到再说
    
      -- 当然上面有点啰嗦了,存粹个人的粗浅理解,望见谅!!