示例以下一组数据
需要随时查关系下所有人或者部分满足条件的人,并且可能存在其他关联表的筛选条件,是按方式一存储来循环查询,还是方式二的存储一次查询。现在主要纠结的是:方式一查询不方便尤其存在其他条件的时候。方式二存的记录太多了,改变一个关系涉及数据太广。大伙还有没有其他推荐的方式
如下,有这么个需求,遇到2就不往下查,是1就一直往下查,最终只取1连续的数据,数据量大不能一次取出来完,要分页查询
关系存成路径path, pid id path 1 2 1 2 3 1,2 3 4 1,2,3 4 5 1,2,3,4 5 6 1,2,3,4,5
path
pid id path
1 2 1
2 3 1,2
3 4 1,2,3
4 5 1,2,3,4
5 6 1,2,3,4,5
使用sql函数find_in_set查询 查 id 4 的下级:
find_in_set
where 4 find_in_set(`path`)
只查ID是可以,关联其他条件就不行了
加上你方式2的level字段,这些字段都放在用户表里面,或者辅助表,查出id再到用户表查。 不可避免的要维护path、level两个字段。 某个用户id4的上级变了就清空整条线:update user setpath='' where 4 find_in_set(path) 然后弄个定时器专门找path 为空的去整理关系。
level
update user set
='' where 4 find_in_set(
)
find_in_set不走索引是个问题,再加上图二需求想一条sql处理更难了(图二还只是一个简单的条件,还可能存在3,4等等),初步看来只能方式二多加几个标记字段处理
用全文索引 match against
mysql8递归查询.....
mysql8
还在用5.7
关系存成路径
path
,pid id path
1 2 1
2 3 1,2
3 4 1,2,3
4 5 1,2,3,4
5 6 1,2,3,4,5
使用sql函数
find_in_set
查询查 id 4 的下级:
只查ID是可以,关联其他条件就不行了
加上你方式2的
level
字段,这些字段都放在用户表里面,或者辅助表,查出id再到用户表查。不可避免的要维护
path
、level
两个字段。某个用户id4的上级变了就清空整条线:
update user set
path='' where 4 find_in_set(
path)
然后弄个定时器专门找
path
为空的去整理关系。find_in_set不走索引是个问题,再加上图二需求想一条sql处理更难了(图二还只是一个简单的条件,还可能存在3,4等等),初步看来只能方式二多加几个标记字段处理
用全文索引 match against
mysql8
递归查询.....还在用5.7