怎么讓MySQL中單句完成無限層次父子關(guān)系查詢
發(fā)表時(shí)間:2023-07-13 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在 SQL Server 中,使用 CTE 表達(dá)式很容易做到無限層次父子關(guān)系查詢;在不支持CTE表達(dá)式的版本中,借助函數(shù)遞歸也可以輕松實(shí)現(xiàn)。 在 MySQL 中,這個(gè)需求的實(shí)例稍顯復(fù)雜, MySQL...
在 SQL Server 中,使用 CTE 表達(dá)式很容易做到無限層次父子關(guān)系查詢;在不支持CTE表達(dá)式的版本中,借助函數(shù)遞歸也可以輕松實(shí)現(xiàn)。
在 MySQL 中,這個(gè)需求的實(shí)例稍顯復(fù)雜, MySQL 中沒有支持遞歸的查詢,沒有表值函數(shù),函數(shù)不支持遞歸,所以通常都是用循環(huán)實(shí)現(xiàn),顯得比較別扭。今天看到一個(gè)用單條語句實(shí)現(xiàn)的遞歸查詢,想法獨(dú)特,分享一下。
表結(jié)構(gòu)和數(shù)據(jù)
CREATE TABLE table1(id int, name varchar(10), parent_id int);
INSERT table1 VALUES
(1, ‘Home’, 0),
(2, ‘About’, 1),
(3, ‘Contact’, 1),
(4, ‘Legal’, 2),
(5, ‘Privacy’, 4),
(6, ‘Products’, 1),
(7, ‘Support’, 2);
查詢 id = 5 的所有父級(jí)
SELECT ID.level, DATA.* FROM(
SELECT
@id as _id,
( SELECT @id := parent_id
FROM table1
WHERE id = @id
) as _pid,
@l := @l+1 as level
FROM table1,
(SELECT @id := 5, @l := 0 ) b
WHERE @id > 0
) ID, table1 DATA
WHERE ID._id = DATA.id
ORDER BY level;
根據(jù)這個(gè)父級(jí)查詢方法,很容易可以寫出查所有子級(jí)的,下面的查詢 id=2 的所有子級(jí)
SELECT ID.level, DATA.* FROM(
SELECT
@ids as _ids,
( SELECT @ids := GROUP_CONCAT(id)
FROM table1
WHERE FIND_IN_SET(parent_id, @ids)
) as cids,
@l := @l+1 as level
FROM table1,
(SELECT @ids :=’1’, @l := 0 ) b
WHERE @ids IS NOT NULL
) id, table1 DATA
WHERE FIND_IN_SET(DATA.id, ID._ids)
ORDER BY level, id
本文講解了如何讓MySQL中單句實(shí)現(xiàn)無限層次父子關(guān)系查詢,更多相關(guān)內(nèi)容請(qǐng)關(guān)注php中文網(wǎng)。
相關(guān)推薦:
帶進(jìn)度的SQL Server FileStream如何存取
當(dāng)忘記 SQL Server 管理員密碼該如何處理
淺析MySQL中concat以及group_concat的使用
以上就是如何讓MySQL中單句實(shí)現(xiàn)無限層次父子關(guān)系查詢的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。