如何讓MySQL中單句實現無限層次父子關係查詢

jacklove
發布: 2019-02-22 16:36:09
原創
4810 人瀏覽過

在 SQL Server 中,使用 CTE 表達式很容易做到無限層次父子關係查詢;在不支援CTE表達式的版本中,借助函數遞歸也可以輕鬆實現。
在 MySQL 中,這個需求的實例稍微複雜, MySQL 中沒有支援遞歸的查詢,沒有表值函數,函數不支援遞歸,所以通常都是用循環實現,看起來比較彆扭。今天看到一個用單一語句實現的遞歸查詢,想法獨特,分享一下。

相關mysql影片教學推薦:《mysql教學

表結構與資料

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 的所有父級

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;
登入後複製

根據這個父級查詢方法,很容易可以寫出查所有子級的,下面的查詢id=2 的所有子級

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中單句實現無限層次父子關係查詢,更多相關內容請關注php中文網。

相關推薦:

有進度的SQL Server FileStream如何存取

#當忘記SQL Server 管理員密碼該如何處理

淺析MySQL中concat以及group_concat的使用

以上是如何讓MySQL中單句實現無限層次父子關係查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板