如何使用闭包表高效查询带有父子关系的树状结构数据?

如何使用闭包表高效查询带有父子关系的树状结构数据?

mysql 查询树状结构数据

当遇到带有父级-子级关系的数据时,例如带有 id、parent_id 和 name 字段的表,并希望根据 name 模糊查询相关层级,就可以使用闭包表来解决。

闭包表

闭包表是一种特殊类型的表,它存储了所有节点及其到根节点的距离。使用闭包表进行模糊查询的主要步骤如下:

创建树表,存储节点及其到根节点的距离。根据 name 模糊查询闭包表,获取相关节点。根据 parent 和 distance 字段,将查询到的节点组合为树结构。

示例

假设有一个树状数据如下:

----食物   ---- 水果     ---- 香蕉     ---- 苹果   ---- 肉类     ---- 鸡肉     ---- 肥牛

若要查询包含 “肉” 的所有节点,则可以使用以下查询:

select * from tree where self like '%肉%';

查询结果如下:

+------+---------+----------+| self | parent  | distance |+------+---------+----------+| 肉类 |      肉类 |       0 || 肉类 |      食物 |       1 || 鸡肉 |      鸡肉 |       0 || 鸡肉 |      肉类 |       1 || 鸡肉 |      食物 |       2 |+------+--------+----------+

接下来,可以通过分组和合并的方式,将查询到的节点组装成树结构:

from_datebase = [    ["鸡肉", "鸡肉", 0],    ["鸡肉", "肉类", 1],    ["鸡肉", "食物", 2],    ["肉类", "肉类", 0],    ["肉类", "食物", 1],]from itertools import groupbyroot = {}for _, path in groupby(from_datebase, key=lambda x: x[0]):    path = sorted(list(path), key=lambda x: -x[2])    node = root    for _, nodename, _ in path:        node = node.setdefault(nodename, {})

最终结果如下:

{'食物': {'肉类': {'鸡肉': {}}}}

其他注意事项

在实际应用中,应使用 id 而不是中文名称来表示节点。闭包表的存储空间会随着层级的增加而增长。插入、更新和删除操作需要特殊处理。

以上就是如何使用闭包表高效查询带有父子关系的树状结构数据?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/49360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 11:31:05
下一篇 2025年11月8日 11:53:18

相关推荐

  • 移动端 CSS 中如何实现标签边框包裹垂直居中效果?

    移动端 css 中还原标签边框包裹垂直居中的设计难题 设计稿中常见的边框包裹文字,文字垂直左右居中的效果,在移动端实现时往往会遇到意想不到的难题,尤其是在安卓和苹果系统下的显示不一致问题。如何解决这一问题,还原设计稿中的视觉效果? 解决方案 flex 布局 立即学习“前端免费学习笔记(深入)”; f…

    2025年12月24日
    200
  • 移动端如何实现标签效果:边框包裹文字,垂直左右居中?

    如何在移动端还原设计稿中的小标签效果:边框包裹文字,垂直左右居中? 在移动端还原设计稿中的小标签效果,例如边框包裹文字,文字垂直左右居中,是一项常见的挑战。使用传统的 css 方式往往会出现垂直居中不一致的问题。针对这个问题,有两种推荐的方式: flex 布局 flex 布局提供了一种更灵活的方法来…

    2025年12月24日
    200
  • 移动端小标签如何完美实现垂直居中?

    在移动端还原设计稿中的小标签垂直居中样式 在移动端还原设计稿中的小标签效果时,常常会遇到垂直居中不够完美的问题,尤其是安卓和苹果上的效果不一致。本文将探讨两种可行的解决方案来解决这一难题。 解决方案 1:flex 布局 flex 布局是一种现代布局系统,可提供灵活且强大的布局选项。对于小标签垂直居中…

    2025年12月24日
    000
  • CSS 砌体 Catness

    css 就像技术中的其他东西一样 – 它总是在变化和发展。该领域正在进行的开发是 css 网格布局模块级别 3,也称为 css masonry 布局。 theo 制作了一段视频,介绍了它的开发方式以及苹果和谷歌就如何实施它进行的辩论。 所有这些让我很高兴尝试 css 砌体! webkit…

    好文分享 2025年12月24日
    000
  • 苹果浏览器网页背景图色差问题:如何解决背景图不一致?

    网页背景图在苹果浏览器上出现色差 一位用户在使用苹果浏览器访问网页时遇到一个问题,网页上方的背景图比底部的背景图明显更亮。 这个问题的原因很可能是背景图没有正确配置 background-size 属性。在 windows 浏览器中,背景图可能可以自动填满整个容器,但在苹果浏览器中可能需要显式设置 …

    2025年12月24日
    400
  • 苹果浏览器网页背景图像为何色差?

    网页背景图像在苹果浏览器的色差问题 在不同浏览器中,网站的背景图像有时会出现色差。例如,在 Windows 浏览器中显示正常的上层背景图,在苹果浏览器中却比下层背景图更亮。 问题原因 出现此问题的原因可能是背景图像未正确设置 background-size 属性。 解决方案 为确保背景图像在不同浏览…

    2025年12月24日
    500
  • 为什么苹果浏览器上的背景图色差问题?

    背景图在苹果浏览器上色差问题 当在苹果浏览器上浏览网页时,页面顶部背景图的亮度高于底部背景图。这是因为窗口浏览器和苹果浏览器存在兼容性差异所致。 具体原因分析 在窗口浏览器中,页面元素的大小是使用像素(px)来定义的。而苹果浏览器中,使用的是逻辑像素(css像素)来定义元素大小。导致了窗口浏览器和苹…

    2025年12月24日
    000
  • 苹果电脑浏览器背景图亮度差异:为什么网页上下部背景图色差明显?

    背景图在苹果电脑浏览器上亮度差异 问题描述: 在网页设计中,希望上部元素的背景图与页面底部的背景图完全对齐。而在 Windows 中使用浏览器时,该效果可以正常实现。然而,在苹果电脑的浏览器中却出现了明显的色差。 原因分析: 如果您已经排除屏幕分辨率差异的可能性,那么很可能是背景图的 backgro…

    2025年12月24日
    000
  • 网络进化!

    Web 应用程序从静态网站到动态网页的演变是由对更具交互性、用户友好性和功能丰富的 Web 体验的需求推动的。以下是这种范式转变的概述: 1. 静态网站(1990 年代) 定义:静态网站由用 HTML 编写的固定内容组成。每个页面都是预先构建并存储在服务器上,并且向每个用户传递相同的内容。技术:HT…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • CSS如何实现任意角度的扇形(代码示例)

    本篇文章给大家带来的内容是关于CSS如何实现任意角度的扇形(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 扇形制作原理,底部一个纯色原形,里面2个相同颜色的半圆,可以是白色,内部半圆按一定角度变化,就可以产生出扇形效果 扇形绘制 .shanxing{ position:…

    2025年12月24日
    000
  • 实例讲解如何用CSS语言创作一根闪电连接线

    效果预览 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/RBjdzZ 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。 请用 chrome, safari, edge 打开观看。 立即学习“…

    2025年12月24日
    000
  • html5如何用li_html5使用li标签方法【标签用法】

    li标签必须嵌套在ol或ul内,不可直接置于body等非法父元素中;需闭合标签;可嵌套多层列表;不可在dl中使用li替代dt/dd。 如果您希望在HTML5中正确使用 标签来构建列表结构,则需要确保标签始终嵌套在有序列表或无序列表内部。以下是几种标准且兼容的使用方法: 一、在无序列表中使用li标签 …

    2025年12月23日
    000
  • html中怎么运行sql语句_html中运行sql语句方法【教程】

    必须通过后端服务执行SQL操作。一、PHP与MySQL交互:使用PHP脚本在服务器端连接数据库,执行查询并嵌入HTML输出,避免硬编码凭证。二、Ajax调用API:前端通过JavaScript向后端API发送请求,服务端执行SQL并返回JSON数据,前端动态渲染结果。三、SQLite与JavaScr…

    2025年12月23日
    000
  • mac 怎么使用html5_mac浏览器直接打开html5文件支持触控操作【使用】

    需依次完成五步:一、将HTML5文件默认关联至浏览器并全部更改;二、在Safari中启用“禁用本地文件限制”;三、系统设置中开启触控板网页滚动与双指轻扫,关闭页面间轻扫;四、用BetterTouchTool绑定手势直启HTML5文件;五、添加touchstart监听及viewport标签验证触控生效…

    2025年12月23日
    000
  • 如何用js写html_使用JavaScript动态生成HTML内容【生成】

    可通过innerHTML、createElement+appendChild、insertAdjacentHTML、DocumentFragment及模板字符串五种方法动态插入HTML:innerHTML最直观;createElement更安全;insertAdjacentHTML支持多位置插入;D…

    2025年12月23日
    000
  • html手机怎么运行_手机运行html方法【教程】

    1、使用手机浏览器可直接打开本地HTML文件,只需通过文件管理器点击文件并选择浏览器打开即可预览;2、借助Spck Editor等专用编辑器应用能实现实时编辑与预览,适合开发调试;3、对于含JavaScript或需服务器支持的动态内容,应安装KSWEB类应用搭建本地服务器,再通过http://loc…

    2025年12月23日
    000
  • html如何连接_连接HTML与数据库或API接口【接口】

    HTML无法直接连接数据库或调用API,需借助JavaScript fetch、PHP中转、Node.js后端或Python Flask等服务端技术实现动态数据交互。 如果您希望在网页中动态获取数据,HTML本身无法直接连接数据库或调用API接口,必须借助服务器端语言或JavaScript等客户端技…

    2025年12月23日
    000
  • 手机怎么运行html5游戏_手机运行html5游戏步骤【指南】

    手机运行HTML5游戏无需安装,只需用现代浏览器打开网页即可。首先确保使用Chrome、Safari或Firefox等支持HTML5的最新浏览器;然后通过官网、二维码或分享链接获取游戏;接着在浏览器中输入网址或点击链接,等待加载后点击屏幕开始游戏;为提升体验,建议连接Wi-Fi、关闭后台应用、横屏操…

    2025年12月23日
    200
  • HTML如何添加批注功能_评论系统实现方案【教程】

    可实现HTML文本批注功能的四种方案:一、基于HTML5自定义属性与JS的静态批注;二、遵循W3C标准的语义化批注;三、嵌入Utterances或Giscus等第三方评论系统;四、自建AJAX评论后端+前端组件。 如果您希望在HTML页面中为特定文本添加可交互的批注功能,或构建一个轻量级的评论系统,…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信