业务逻辑中常有这样的情况:
得到某一个无限分类下面的全部文章。
统计某一账号下面店铺的全部订单。
经常会用到article: in (cid,……),
order: in (shop_id,……)
如果某个分类下面有很多很多子分类,总之很多很多,可能无限,某一个账号下面也有n个店铺,那么in ()不撑死了啊,sql长度不能很大吧
不知道对于这种情况有没有什么好的方法,项目中很多地方都是这样用in (),从来没有考虑过这个问题,今天突然想到了,意识到了这个问题,不知道有没有好的优化方式。
在线等大神,谢谢了!
不记得有代替in的语句,可能也是因为我不太关注sql导致水平较低哈。
这种问题通常是由于无限分类表本身的设计问题导致的,例如只有id, parent_id两个字段,所以只要in了,如果无限分类表包含 id, parent_id, level(树高), path这个字段的时候就可以避免使用in了。
我个人使用的一个无限分级表包括以下的字段
id 唯一索引
parent_id 父级的id
number 数轴投影序号
leve 树高
left_number 已当前节点为树根时,其下的最左端的子节点的数轴投影序号
一个简单的例子演变:
插入一个子节点
[id:2, level:2 number: 1, left_number:1]
于level2再插入一个子节点
[id:2, level:2 number: 1, left_number:1] [id:2, level:2 number: 2, left_number:2]
这种树形的数据维护很麻烦,但是搜索要快的多,例如任意节点下的全部子节点就是left_number到number-1。用这个做过一个Chuan啊销系统的人员结构树,效果很不错。
核心思路就是把一颗树的分支转换为数轴上的点/线段,从而在数轴上得到完整的树的投影。
忘了一个top_id,表示节点对应的根节点,否则表里面有多颗树的话就出问题了。