首页 > 其他分享 >设计思路-关于树节点结构设计

设计思路-关于树节点结构设计

时间:2023-09-21 13:58:07浏览次数:29  
标签:remotetag id re tag path 思路 节点 结构设计

增加path字段存储树的路径

1.可以通过当前节点追溯到上级所有父节点

2.可以通过当前节点查询所有子节点

比如满足以下需求

参考sql

------------------------------所有设备权限------------------------------
1.获得节点
 explain SELECT `id`,
       `userid`,
       `name`,
       `bgcolor`,
       `remotenum`,
       `orderid`,
       `pid`,
       `path`,
       `depth`,
       `tag_type`
FROM `re_tag`
WHERE userid = 12532915
  AND pid = 0
ORDER BY re_tag.tag_type desc, case when orderid > 0 then orderid else id end asc

2.获得数量 count位动态生成,前端目前分页是80一页
SELECT COUNT(distinct CASE
                          WHEN re_tag.path REGEXP '[[:<:]]317[[:>:]]' OR re_remotetag.tagid = 317
                              THEN re_remotetag.remoteid END) AS count_317,
       COUNT(distinct CASE
                          WHEN re_tag.path REGEXP '[[:<:]]134863[[:>:]]' OR re_remotetag.tagid = 134863
                              THEN re_remotetag.remoteid END) AS count_134863
FROM `re_remotetag`
         inner JOIN `re_tag` ON re_remotetag.tagid = re_tag.id
WHERE re_tag.userid = 12532915

3.是否有下级节点
explain SELECT pid as id, COUNT(1) as count
FROM `re_tag`
WHERE userid = 12532915
  AND pid IN (12532915,317,134863,142473,148154,171334)
GROUP BY pid
4.获取某个节点子节点
ent_tag.id IN (?) 为节点自身  (ent_tag.path REGEXP ?)) 为路径包含
SELECT distinct CASE WHEN ent_tag.path REGEXP '[[:<:]]55840[[:>:]]' OR ent_tag.id = 55840 THEN ent_tag.id END as tag_id
FROM `ent_tag`
WHERE ent_tag.ent_userid = ?
  AND (ent_tag.id IN (?) OR (ent_tag.path REGEXP ?))

------------------------------含有分组和设备场景------------------------------
1.获得节点  re_tag.id为授权的节点,path 也为授权节点拼接 id in为所有授权节点的父节点拼接 分页参数前端传80
explain SELECT `id`,
       `userid`,
       `name`,
       `bgcolor`,
       `remotenum`,
       `orderid`,
       `pid`,
       `path`,
       `depth`,
       `tag_type`
FROM `re_tag`
WHERE userid = 12532915
  AND pid = 0
  AND (((re_tag.id IN (134864,142743) OR (re_tag.path REGEXP '[[:<:]]134864|142473[[:>:]]'))) OR (id IN (134863, 171337,19858496,19858497)))
ORDER BY re_tag.tag_type desc, case when orderid > 0 then orderid else id end asc
LIMIT 100

2.获取数量场景
  re_tag.id为授权节点数量 regexp为授权节点动态生成 remoteid为直接授权主机的ids
explain SELECT COUNT(distinct CASE
                          WHEN re_tag.path REGEXP '-317-' OR re_remotetag.tagid = 317
                              THEN re_remotetag.remoteid END) AS count_317,
       COUNT(distinct CASE
                          WHEN re_tag.path REGEXP '[[:<:]]134863[[:>:]]' OR re_remotetag.tagid = 134863
                              THEN re_remotetag.remoteid END) AS count_134863,
       COUNT(distinct CASE
                          WHEN re_tag.path REGEXP '[[:<:]]142473[[:>:]]' OR re_remotetag.tagid = 142473
                              THEN re_remotetag.remoteid END) AS count_142473,
       COUNT(distinct CASE
                          WHEN re_tag.path REGEXP '[[:<:]]171337[[:>:]]' OR re_remotetag.tagid = 171337
                              THEN re_remotetag.remoteid END) AS count_171337
FROM `re_remotetag`
         inner JOIN `re_tag` ON re_remotetag.tagid = re_tag.id
WHERE re_tag.userid = 12532915
  AND (re_tag.id IN (134864,142473 ) OR (re_tag.path REGEXP ' [[:<:]]134864|142473[[:>:]]') OR re_remotetag.remoteid IN (994475629))

3.是否含有子节点
pid为查询的pid id为授权节点的id集合
explain SELECT pid as id, COUNT(1) as count
FROM `re_tag`
WHERE ((userid = 12532915 AND pid IN (317,134863,142473)) OR (id IN (171337,134863,134863,171337,19858496,19858497,134864,142473)))
GROUP BY pid

4.获取指定节点子节点
regepx为查询父节点id,re_tag.id IN (?, ?)为授权节点id re_tag.path REGEXP ? 为授权节表达式  re_tag.id IN 为授权主机带过来的
SELECT distinct CASE WHEN re_tag.path REGEXP '[[:<:]]134863[[:>:]]' OR re_tag.id = 134863 THEN re_tag.id END as tag_id
FROM `re_tag`
WHERE re_tag.userid = ?
  AND (re_tag.id IN (?, ?) OR (re_tag.path REGEXP ?) OR re_tag.id IN (?)) 

mysql regexp不支持此写法 后面改成 path字段例子:1-2,33-31

CONCAT('-',ent_tag.path, '-') REGEXP ?  -22-|-333-  

 

标签:remotetag,id,re,tag,path,思路,节点,结构设计
From: https://www.cnblogs.com/LQBlog/p/17719785.html

相关文章

  • 请分享一下数据分析方面的思路,如何做好数据分析?
    编辑搜图数据分析是一门非常关键和复杂的领域,它帮助组织和个人深入理解数据,并从中提取有价值的信息和洞察。下面是一个关于如何做好数据分析的详细介绍,涵盖了数据分析的整个过程。第一部分:准备阶段在进行数据分析之前,有几个重要的准备步骤需要完成。首先,明确你的目标和问题,确保......
  • hadoop和hbase节点添加和单独重启
    有时候hadoop或hbase集群运行时间久了后,某些节点就会失效,这个时候如果不想重启整个集群(这种情况在很多情况下已经不被允许),这个时候可以单独重启失效节点。HADOOP:hadoop中重启单节点的方法和增加新节点其实是一样的。1、我们先看下如何了解hadoop机器的情况,可......
  • 在线问诊 Python、FastAPI、Neo4j — 创建 饮食节点
    目录饮食数据创建节点根据疾病、症状,判断出哪些饮食不能吃,哪些建议多吃饮食数据foods_data.csv建议值用“”引起来。避免中间有,号造成误识别饮食"辣椒""大蒜""芥末""海鲜""胡萝卜""核桃仁""菠菜""西红柿""香蕉"创建节点重构代码,将defexecute_write(sel......
  • PXC某个节点异常恢复
    PerconaXtraDBCluster是mysql的一种高可用架构,集群由多个节点组成,建议至少配置3个节点,其中每个节点都包含跨节点同步的相同数据集。以三节点为例,集群某个节点因硬件、网络、脑裂等原因,退出集群后,如果剩余两节点写集缓存(gcache.size)中仍然还有异常节点退出集群后执行的事务信息,......
  • Hadoop集群中增加新节点
    向一个正在运行的Hadoop集群中增加几个新的Nodes1.新节点上部署java/hadoop程序,配置相应的环境变量2.新节点上增加用户,从master上拷贝id_rsa.pub并配置authorized_keys3.新节点上设置host,需要有集群中各节点的host对应4.新节点上建立相关的目录,并修改属主5.master的slaves文件......
  • 2023年研究生数学建模竞赛思路及代码预定
    第二十届“华为杯”中国研究生数学建模竞赛报名时间:9月17日17:00前完成报名竞赛时间:2023年9月22日8:00至2023年9月26日12:00(参考往年)报名费:每队300元报名网址:https://cpipc.acge.org.cn/   建议尽快抽出一两个小时整合一下常用的网站、工具资料等,尽快熟悉一些上手比较快的软......
  • 在线问诊 Python、FastAPI、Neo4j — 创建 疾病节点
    目录疾病数据创建节点根据检查结果、医生的临床经验得出疾病疾病数据disease_data.csv建议值用“”引起来。避免中间有,号造成误识别疾病"干眼""右膝髌上囊及关节腔少量积液"创建节点importloggingimportpandasaspdfromutils.neo4j_providerimportdriverloggi......
  • 在线问诊 Python、FastAPI、Neo4j — 创建 检查节点
    目录症状数据创建节点根据不同的症状,会建议做些相对应的检验、检查症状数据examine_data.csv建议值用“”引起来。避免中间有,号造成误识别检查"膝关节核磁""眼睛酸胀""视力""砂眼""辨色力""角膜""眼底"创建节点参考创建药品节点。importloggingfromutils.neo......
  • 删除链表的节点
    一、问题描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。1.此题对比原题有改动2.题目保证链表中节点的值互不相同3.该题只会输出返回的链表和结果做对比,所以若使用C或C++语言,你不需要free或delete被删除的节点# 二、......
  • dom4j操作Element节点方法
    1.获取文档的根节点ElementrootElm=document.getRootElement();2.取得某节点的单一子节点ElementmemberElm=root.element("tagName");3.取得节点的文字Stringtext=root.elementText("name");4.取得某节点下名为"member"的所有字节点并进行遍历Listnodes=rootEl......