需求
按條件查詢選單及其子選單。
表結構sys_menu
表,一列是id
,一列是parent_id
,level
表示選單層級,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中遞迴查詢
今天在業務中,需要對sql 進行修改,之前的sql 是跑在oracle中,現在跑在mysql上 1.在oracle中sql 語句如下 select uuid,substr xs,2,length xs as ztc,mc,xspy,parentid from oa ztc where xs like...
mysql 遞迴 mysql遞迴查詢
find in set 函式 函式語法 find in set str,strlist str 代表要查詢的字串 strlist 是乙個以逗號分隔的字串,如 a,b,c 此函式用於查詢 str 字串在字串 strlist 中的位置,返回結果為 1 n 若沒有找到,則返回0。concat 它用於連線n...
mysql遞迴查詢統計 mysql遞迴查詢
樣例資料 create table treenodes id int primary key,nodename varchar 20 pid int select from treenodes id nodename pid 1 a 0 2 b 1 3 c 1 4 d 2 5 e 2 6 f 3 7...