关于无限极分类的一些理解
话说这一小节有些地方确实不好理解,可能由于时间的关系,有些关键的地方老师都是一语带过,并没有作详细的解说。这就在一定程度上增加了我们理解上的困难,其实课程本身并不难理解。下面我说说自己的一些理解,如有不对之处,还请各位指点。
首先有几个关键的概念要搞清楚:1、LEFT [OUTER] JOIN 即左外连接 是怎样显示记录的?
2、在自身连接中怎么区分子表和父表?
关于第一个问题,盗用一下老师的PPT:
这里所有说的左表和右表是以 LETF JOIN 为参照的,例如:表1 LEFT JOIN 表2; 表示显示表1的全部记录,表2只显示符合连接条件的记录。至于表1和表2,哪个是子表,哪个是父表,依照LEFT JOIN是没法判断的。
第二个问题,我们来看一段代码:
在本节课程中,可以依照ON后面的表达示来判断子表和父表:拥有parent_id这一列的表是子表,反之就是父表。如果你写成这样 s.type_id = p.parent_id;那么此时就是把s当作父表,把p当作子表。s与p都只是一个名字而已,并不是区分子表与父表的标准,只不过为了方便识别,我们习惯把子表取名为s(son), 把父表取名为p(parent)。
下面来总结一下这节课程的两个主要内容,先把原表放上来
第一个内容:把上图的表当作子表,查询其上面的父类,返回的字段包括: 子类id,子类名称,父类名称。
为了方便理解,我先这样写一个:
我们看到,家用电器和电脑、办公这两类没有父类,因为他们是最上面的类,只有子类,没有父类。由于我们把子表放在了LEFT JOIN的左边,所以显示了子表的所有记录,而父表只显示符合连接条件的记录,如果不存在父类,则显示NULL。
老师课程上返回的是三列,我们把父类id截取掉,结果如下:
第二个内容就是:把原表当作父表,查询其下面拥有的子类。返回的字段有:父类ip,父类名称,子类名称。
为了方便理解,我先这样写一个:
我们看到父表中有很多没有子类,这是因为他们是最底层的类别,他们只有父类,没有子类。由于我们把父表放在了LEFT JOIN的左边,所以显示了父表的所有记录,子表只显示符合连接条件的记录,如果不存在子类,则显示NULL。
老师课程上返回的是三列,我们把子类id截取掉,结果如下:
然后就是对上面的表,依照父类的id进行分组,并统计子类的数目: