Mysql查詢語(yǔ)句如何實(shí)現(xiàn)無(wú)限層次父子關(guān)系查詢
一、前言
單表存儲(chǔ)上下級(jí)關(guān)系,使用mysql 內(nèi)置函數(shù)循環(huán)遞歸查出來(lái)
二、相關(guān)語(yǔ)法函數(shù)介紹
@
@是用戶變量,@@是系統(tǒng)變量。
:=
不只在set和update時(shí)時(shí)賦值的作用,在select也是賦值的作用。
group_concat()
將group by產(chǎn)生的同一個(gè)分組中的值連接起來(lái),返回一個(gè)字符串結(jié)果。
FIND_IN_SET()
查詢字段(strlist)中包含(str)的結(jié)果,返回結(jié)果為null或記錄
三、具體實(shí)現(xiàn)
創(chuàng)建表
查詢父級(jí)為 2 的下級(jí) 無(wú)限級(jí)查詢
SELECT @ids AS _ids, ( SELECT @ids := GROUP_CONCAT( descendant ) FROM relation WHERE FIND_IN_SET( ancestor, @ids ) ) AS cids, @l := @l + 1 AS LEVEL FROM relation, ( SELECT @ids := 2, @l := 0 ) b WHERE @ids IS NOT NULL
列表化
SELECT descendant.LEVEL, DATA.* FROM ( SELECT @ids AS _ids, ( SELECT @ids := GROUP_CONCAT( descendant ) FROM relation WHERE FIND_IN_SET( ancestor, @ids ) ) AS cids, @l := @l + 1 AS LEVEL FROM relation, ( SELECT @ids := 2, @l := 0 ) b WHERE @ids IS NOT NULL ) descendant, sys_dept_relation DATA WHERE FIND_IN_SET( DATA.descendant, descendant._ids ) ORDER BY LEVEL, DATA.descendant
查詢ID為 8 的上級(jí) 無(wú)限級(jí)查詢
SELECT @id AS _id, ( SELECT @id := ancestor FROM relation WHERE descendant = @id ) AS _pid, @l := @l + 1 AS LEVEL FROM relation, ( SELECT @id := 8, @l := 0 ) b WHERE @id > 0
四、效率問(wèn)題
我目前測(cè)試表有8千多數(shù)據(jù)量
EXPLAN 相關(guān)參數(shù)
Select_type:
PRIMARY
:查詢中最外層的SELECT(如兩表做UNION或者存在子查詢的外層的表操作為PRIMARY,內(nèi)層的操作為UNION)DERIVED
:被驅(qū)動(dòng)的SELECT子查詢(子查詢位于FROM子句)UNCACHEABLE SUBQUERY
:一個(gè)子查詢的結(jié)果不能被緩存,必須重新評(píng)估外鏈接的第一行
Type:
NULL
: MySQL在優(yōu)化過(guò)程中分解語(yǔ)句,執(zhí)行時(shí)甚至不用訪問(wèn)表或索引,例如從一個(gè)索引列里選取最小值可以通過(guò)單獨(dú)索引查找完成。index
: Full Index Scan,index與ALL區(qū)別為index類型只遍歷索引樹System
:system是const類型的特例,當(dāng)查詢的表只有一行的情況下,使用system
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL配置文件my.cnf中文詳解附mysql性能優(yōu)化方法分享
Mysql參數(shù)優(yōu)化對(duì)于新手來(lái)講,是比較難懂的東西,其實(shí)這個(gè)參數(shù)優(yōu)化,是個(gè)很復(fù)雜的東西,對(duì)于不同的網(wǎng)站,及其在線量,訪問(wèn)量,帖子數(shù)量,網(wǎng)絡(luò)情況,以及機(jī)器硬件配置都有關(guān)系,優(yōu)化不可能一次性完成,需要不斷的觀察以及調(diào)試,才有可能得到最佳效果。2011-09-09CentOS6.7 mysql5.6.33修改數(shù)據(jù)文件位置的方法
mysql存放的數(shù)據(jù)文件,分區(qū)容量較小,目前已經(jīng)滿,導(dǎo)致mysql連接不上,怎么解決呢?下面小編給大家分享CentOS6.7 mysql5.6.33修改數(shù)據(jù)文件位置的方法,一起看看吧2017-06-06安裝和使用percona-toolkit來(lái)輔助操作MySQL的基本教程
這篇文章主要介紹了安裝和使用percona-toolkit來(lái)輔助操作MySQL的基本教程,這里舉了五個(gè)最常見的命令用法,需要的朋友可以參考下2015-11-11MySQL和連接相關(guān)的timeout 的詳細(xì)整理
這篇文章主要介紹了MySQL和連接相關(guān)的timeout 的詳細(xì)整理的相關(guān)資料,本文主要總結(jié)下和連接有關(guān)的timeout,需要的朋友可以參考下2017-08-08MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語(yǔ)法詳解
這篇文章主要介紹了MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語(yǔ)法,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11MySQL4 File ‘c:\mysql\share\charsets\?.conf’ not found (Errc
File ‘c:\mysql\share\charsets\?.conf’ not found (Errcode: 22) Character set ‘#33′ is not a compiled character set and is not specified in the ‘c:\mysql\share\charsets\Index’ file2013-08-08MySQL 日期時(shí)間格式化函數(shù) DATE_FORMAT() 的使用示例詳解
`DATE_FORMAT()`是MySQL中用于格式化日期時(shí)間的函數(shù),本文詳細(xì)介紹了其語(yǔ)法、格式化字符串的含義以及常見日期時(shí)間格式組合,感興趣的朋友一起看看吧2025-03-03MySQL與PHP的基礎(chǔ)與應(yīng)用專題之?dāng)?shù)據(jù)完整性
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL?AB?公司開發(fā),屬于?Oracle?旗下產(chǎn)品。MySQL?是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,本系列將帶你掌握php與mysql的基礎(chǔ)應(yīng)用,本篇從數(shù)據(jù)完整性開始2022-02-02mysql性能優(yōu)化腳本mysqltuner.pl使用介紹
無(wú)意中發(fā)現(xiàn)了,major哥們開發(fā)的一個(gè)性能分析腳本,很有意思,可以通過(guò)這個(gè)腳本學(xué)學(xué)他的思想2013-02-02如何查本地mysql的username和密碼及更新密碼幾種方式
這篇文章主要介紹了光宇如何查找本地MySQL數(shù)據(jù)庫(kù)的用戶名和密碼,包括查看當(dāng)前用戶、列出所有用戶、重置密碼以及檢查配置文件,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11