SQL已知父类物料的ID子类的怎么填充?

注:parent_id 为0表示顶级父节点,即A是顶级父辈,没有父节点
转储SQL表结构及数据

需求:根据一个子ID,查询所有父类

我使用将SQL语句拆分的方式,并展示每句SQL运行结果,让各位可以看的更明白,以便于根据你自己的业务需求进行更改

1、先不管T2,先把T1的SQL抽出来看

从这里可以看出,其实T1已经找出ID为5节点的所有父节点了,和T2(即demo表)进行左连接,只不过是为了根据Id获取Name而已。而且还可以看出@l其实在整个SQL中并没有什么作用,只是用来标识节点的等级,底级子节点的lvl为1,父节点lvl值越大表示越靠近顶级父节点,想象一下树结构,你就明白了

这里看出,其实@r,@l 就是一个变量而已,

作为变量自然你可以随便起名,当然也可以随便赋值,改成@a,@b也都是可以的

那这句SQL的意思就出来了,它表示给变量@r赋值,值为5,给@l赋值,值为0

因此,其实整个SQL的意思也明了了就是根据子ID5,查询所有父类

3、搞懂变量@r 值如何变化

根据MYSQL执行顺序(在文章末尾处),SQL语句在执行时会先执行From,即会先执行上一步的赋值操作,因此这里的_id值为5,所以上面的SQL等同于如下SQL

这句SQL肯定没人不会,但是有一个点很重要,它是整个执行过程的核心,就是@r := parent_id,它在查询Id为5的节点的父Id时,把这个父Id同时赋给了变量@r。因此@r值改变了,它从5变为了4。

这个时候思路就很清晰了,只要我们设置限制条件,让SQL在@r为0的时候结束循环就OK了

这个就没什么好说的了,<>符号在MYSQL中表示不等于,这就是我们在第四步中所说的限制条件,它限制了@r这个变量不能等于0。所以当@r不等于0时,SQL语句会根据子ID向上查询父ID,又把父ID当做子ID赋值给@r,再次向上查询,直至@r变量的值为0为止。
补充:如果业务不需要,可以完全可以去掉@l变量

可以看出@l其实在整个SQL中并没有什么作用,只是用来标识节点的等级,这也证实了我们上述第一步的关于@l的解释

因为这个过程很类似于JAVA通过构造树结构向上递归查询的方式,所以这个SQL形式被很多人叫做MYSQL递归查询

关于MYSQL的查询顺序

最先执行的是FROM操作,最后执行的是LIMIT操作。每个操作都会产生一个虚拟表,该虚拟表作为一个处理的输入

}

relationship是sqlalchemy中的用于创建两个对象之间的关系的一个对象,跟原本的mysql没有太大关系,但是relationship一定要建立在具有外键关系的两个对象上

就是使用backref就不用再两个具有外键的类上都声明relationship。


属性用来表示这两个关联起来的对象的增删的时候之间的关系

为了表达更清晰,声明了relationship属性的类我们称之为子类,没有声明的我们称之为父类,使用上面的user和article例子

  • 当删除子对象时,父对象也一起被删除,如果子对象有指向父对象的外键且这个外键指向这个被删除的父对象,那么这个外键设置为null
  • 当删除父对象时,子对象没有删除,如果子对象有指向父对象的外键且这个外键指向这个被删除的父对象,那么外键设置为null

delete-orphan实在delete的基础上,加上当子对象被解除跟父对象的关系的时候就会被标志为删除


}

我要回帖

更多关于 update里面嵌套子查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信