Mysql中的递归查询

摘要:
需要按条件查询菜单及其子菜单。表结构sys_Menu表,其中一列是ID,一列是parent_ID,level表示菜单级别,name表示菜单名称。=“要过滤的根菜单条件”)and表示每次找到匹配条件时都使用@pid临时参数将ID添加到@pid变量。以下菜单使用另一种逻辑。陷阱不应该是正式的方案,但可以在MySQL 5.7中实现。如果在MySQL 8中实现,最好使用CTE。注意,第一个子查询具有orderbylevel,这确保根节点将首先添加到@pid。否则,在查询整个表时,可能会先找到子节点,然后错过。

需求

按条件查询菜单及其子菜单。

表结构

sys_menu表,一列是id,一列是parent_idlevel表示菜单层级,name菜单名称。

其中level=1的跟菜单,parent_id为空。

查询语句

SELECT @pid,menu.* FROM (select * from sys_menu order by level) menu,(SELECT @pid := '$') pd
where ((FIND_IN_SET( menu.parent_id, @pid ) > 0) or 
	(menu.parent_id is null and menu.level=1 and menu.name!='需要过滤的根菜单条件'))
AND ((@pid := concat( @pid, ',', menu.id )) is not null)

说明

利用@pid临时参数,每次匹配到一个符合条件的,则将id加入@pid变量中。
过滤时,利用FIND_IN_SET@pid中查找parent_id在其中的菜单。

其中跟菜单利用的是另外的逻辑(例子里是排除了指定名称的跟菜单)。

陷阱

其实这应该不算一个官方方案,在Mysql5.7可以,如果在Mysql 8中,最好还是利用CTE实现。

注意到第一个子查询有order by level,这样确保了根节点会被首先加入@pid中,否则当全表查询时,可能子节点会先被找到而漏掉。

免责声明:文章转载自《Mysql中的递归查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇input限制输入JavaScript中unicode编码与String互转(三种方法)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Flink实战(八十三):FLINK-SQL应用场景(一)维表join(五)Flink SQL之维表join之Temporal Table Join

https://zhuanlan.zhihu.com/p/165962937?utm_source=qq 维表是数仓中的一个概念,维表中的维度属性是观察数据的角度,在建设离线数仓的时候,通常是将维表与事实表进行关联构建星型模型。在实时数仓中,同样也有维表与事实表的概念,其中事实表通常存储在kafka中,维表通常存储在外部设备中(比如MySQL,HBase)...

MySQL mysqldump数据导出详解

  转自:http://www.cnblogs.com/chenmh/p/5300370.html 介绍  在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具;它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有的参数详细说明列出来。 语法: 默认不带参数的导出,导出文本内容大概如...

Infobright数据库使用

最近公司要做一个用户访问日志记录统计分析的功能,需要记录日志,但是公司的产品一天大概产生百万级的日志信息, 本身日志记录信息就比较固化和简单(基本不会存在改动),平时没有什么用,就是在统计分析时需要查用一下,另外日志需要长期存储不删除! 于是问题的难点是:如何存储大量的日志信息和在此基础上做查询分析。 日志量:1天100万,一个月就是3000万,数据量大,...

MySQL单表最大限制

  想把一个项目的数据库导出来,然后倒入到自己熟悉的MySQL数据库中进行运行和调试。导出来后,发现sql文件整整有12G多大,忽然想起来,MySQL好像有个叫做容量限制的神奇特性,但是忘了上限是多少了,所以查阅资料得出了如下结果:   在老版本的 MySQL 3.22 中,MySQL的单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎。但...

Navicet Mysql数据库电脑本地备份

Navicet Mysql数据库电脑本地备份 1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库。点击“计划”,再点击“新建批处理作业”。 2.双击上面的可用任务,它就会到下面的列表里去,代表你选择了这个任务。 3.点击保存,弹出个命名对话框,给这个任务取个名字,点击“确定”。 4.点击“设置”计划任务。 5.弹出的对话框,...

二进制日志备份与恢复,快照备份,复制

二进制日志备份与恢复 二进制日志非常关键,我们可以通过它来完成point-in-time的恢复工作。MySQL数据库的复制同样需要二进制日志。默认情况下并不启用二进制日志,要使用二进制日志,首先必须启用它,在配置文件中进行如下设置: [mysqld] log-bin 对于InnoDB存储引擎只是简单启用二进制日志是不够的,还需要启用一些其他参数来保证安全和...