无限级关系表存储处理

mosquito

示例以下一组数据
截图

需要随时查关系下所有人或者部分满足条件的人,并且可能存在其他关联表的筛选条件,是按方式一存储来循环查询,还是方式二的存储一次查询。现在主要纠结的是:方式一查询不方便尤其存在其他条件的时候。方式二存的记录太多了,改变一个关系涉及数据太广。大伙还有没有其他推荐的方式

如下,有这么个需求,遇到2就不往下查,是1就一直往下查,最终只取1连续的数据,数据量大不能一次取出来完,要分页查询
截图

627 2 0
2个回答

ichynul

关系存成路径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 的下级:

where 4 find_in_set(`path`)
  • mosquito 2023-04-04

    只查ID是可以,关联其他条件就不行了

  • ichynul 2023-04-04

    加上你方式2的level字段,这些字段都放在用户表里面,或者辅助表,查出id再到用户表查。
    不可避免的要维护pathlevel两个字段。
    某个用户id4的上级变了就清空整条线:update user setpath='' where 4 find_in_set(path)
    然后弄个定时器专门找path 为空的去整理关系。

  • mosquito 2023-04-04

    find_in_set不走索引是个问题,再加上图二需求想一条sql处理更难了(图二还只是一个简单的条件,还可能存在3,4等等),初步看来只能方式二多加几个标记字段处理

  • Gin 2023-04-04

    用全文索引 match against

咸鱼.php

mysql8递归查询.....

年代过于久远,无法发表回答
🔝