最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細聊一聊mysql的樹形結構存儲以及查詢

 更新時間:2022年04月05日 11:13:43   作者:go4it  
由于mysql是關系型數(shù)據(jù)庫,因此對于類似組織架構,子任務等相關的樹形結構的處理不是很友好,下面這篇文章主要給大家介紹了關于mysql樹形結構存儲以及查詢的相關資料,需要的朋友可以參考下

本文主要研究一下mysql的樹形結構存儲及查詢

存儲parent

這種方式就是每個節(jié)點存儲自己的parent_id信息

  • 建表及數(shù)據(jù)準備
CREATE TABLE `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `menu` (`id`, `name`, `parent_id`) VALUES
(1, 'level1a',  0),
(2, 'level1b', 0),
(3, 'level2a-1a',1),
(4, 'level2b-1a',1),
(5, 'level2a-1b', 2),
(6, 'level2b-1b', 2),
(7, 'level3-2a1a', 3),
(8, 'level3-2b1a', 4),
(9, 'level3-2a1b', 5),
(10, 'level3-2b1b', 6);
  • 查詢
-- 查詢跟節(jié)點下的所有節(jié)點
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3
FROM menu AS t1
LEFT JOIN menu AS t2 ON t2.parent_id = t1.id
LEFT JOIN menu AS t3 ON t3.parent_id = t2.id
WHERE t1.name = 'level1a';

+---------+------------+-------------+
| lev1    | lev2       | lev3        |
+---------+------------+-------------+
| level1a | level2a-1a | level3-2a1a |
| level1a | level2b-1a | level3-2b1a |
+---------+------------+-------------+

-- 查詢?nèi)~子節(jié)點
SELECT t1.name FROM
menu AS t1 LEFT JOIN menu as t2
ON t1.id = t2.parent_id
WHERE t2.id IS NULL;

+-------------+
| name        |
+-------------+
| level3-2a1a |
| level3-2b1a |
| level3-2a1b |
| level3-2b1b |
+-------------+

存儲及修改上比較方便,就是要在sql里頭查詢樹比較費勁,一般是加載到內(nèi)存由應用自己構造

存儲path

這種方式在存儲parent的基礎上,額外存儲path,即從根節(jié)點到該節(jié)點的路徑

  • 建表及數(shù)據(jù)準備
CREATE TABLE `menu_path` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `path` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `menu_path` (`id`, `name`, `parent_id`, `path`) VALUES
(1, 'level1a', 0, '1/'),
(2, 'level1b', 0, '2/'),
(3, 'level2a-1a',1, '1/3'),
(4, 'level2b-1a',1, '1/4'),
(5, 'level2a-1b', 2, '2/5'),
(6, 'level2b-1b', 2, '2/6'),
(7, 'level3-2a1a', 3, '1/3/7'),
(8, 'level3-2b1a', 4, '1/4/8'),
(9, 'level3-2a1b', 5, '2/5/9'),
(10, 'level3-2b1b', 6, '2/6/10');
  • 查詢
-- 查詢某個節(jié)點的所有子節(jié)點
select * from menu_path where path like '1/%'
+----+-------------+-----------+-------+
| id | name        | parent_id | path  |
+----+-------------+-----------+-------+
| 1  | level1a     | 0         | 1/    |
| 3  | level2a-1a  | 1         | 1/3   |
| 4  | level2b-1a  | 1         | 1/4   |
| 7  | level3-2a1a | 3         | 1/3/7 |
| 8  | level3-2b1a | 4         | 1/4/8 |
+----+-------------+-----------+-------+

查找某個節(jié)點及其子節(jié)點比較方面,就是修改比較費勁,特別是節(jié)點移動,所有子節(jié)點的path都得跟著修改

MPTT(Modified Preorder Tree Traversal)

不存儲parent_id,改為存儲lft,rgt,它們的值由樹的先序遍歷順序決定

  • 建表及數(shù)據(jù)準備
CREATE TABLE `menu_preorder` (
  `id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `lft` int(11) NOT NULL DEFAULT '0',
  `rgt` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

                   1(level1a)14
         2(level2a)7                8(level2b)13
3(level3a-2a)4 5(level3b-2a)6 9(level3c-2b)10 11(level3d-2b)12

INSERT INTO `menu_preorder` (`id`, `name`, `lft`, `rgt`) VALUES
(1, 'level1a', 1, 14),
(2, 'level2a',2, 7),
(3, 'level2b',8, 13),
(4, 'level3a-2a', 3, 4),
(5, 'level3b-2a', 5, 6),
(6, 'level3c-2b', 9, 10),
(7, 'level3d-2b', 11, 12);

select * from menu_preorder
+----+------------+-----+-----+
| id | name       | lft | rgt |
+----+------------+-----+-----+
| 1  | level1a    | 1   | 14  |
| 2  | level2a    | 2   | 7   |
| 3  | level2b    | 8   | 13  |
| 4  | level3a-2a | 3   | 4   |
| 5  | level3b-2a | 5   | 6   |
| 6  | level3c-2b | 9   | 10  |
| 7  | level3d-2b | 11  | 12  |
+----+------------+-----+-----+
  • 查詢
-- 查詢某個節(jié)點及其子節(jié)點,比如level2b
select * from menu_preorder where lft between 8 and 13
+----+------------+-----+-----+
| id | name       | lft | rgt |
+----+------------+-----+-----+
| 3  | level2b    | 8   | 13  |
| 6  | level3c-2b | 9   | 10  |
| 7  | level3d-2b | 11  | 12  |
+----+------------+-----+-----+

-- 查詢所有葉子節(jié)點
SELECT name
FROM menu_preorder
WHERE rgt = lft + 1;

+------------+
| name       |
+------------+
| level3a-2a |
| level3b-2a |
| level3c-2b |
| level3d-2b |
+------------+

-- 查詢某個節(jié)點及其父節(jié)點
SELECT parent.*
FROM menu_preorder AS node,
menu_preorder AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = 'level2b'
ORDER BY parent.lft;

+----+---------+-----+-----+
| id | name    | lft | rgt |
+----+---------+-----+-----+
| 1  | level1a | 1   | 14  |
| 3  | level2b | 8   | 13  |
+----+---------+-----+-----+

-- 樹形結構展示
SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name
FROM menu_preorder AS node,
menu_preorder AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+--------------+
| name         |
+--------------+
| level1a      |
|  level2a     |
|   level3a-2a |
|   level3b-2a |
|  level2b     |
|   level3c-2b |
|   level3d-2b |
+--------------+

好處是通過lft進行范圍(該節(jié)點的lft,rgt作為范圍)查找就可以,缺點就是增刪節(jié)點導致很多節(jié)點的lft及rgt都要修改

小結

  • 存儲parent的方式最為場景,一般樹形結構數(shù)據(jù)量不大的話,直接在應用層內(nèi)存構造樹形結構和搜索
  • 存儲path的好處是可以借助path來查找節(jié)點及其子節(jié)點,缺點就是移動node需要級聯(lián)所有子節(jié)點的path,比較費勁
  • MPTT的方式好處是通過lft進行范圍(該節(jié)點的lft,rgt作為范圍)查找就可以,缺點就是增刪節(jié)點導致很多節(jié)點的lft及rgt都要修改

doc

到此這篇關于mysql樹形結構存儲以及查詢的文章就介紹到這了,更多相關mysql樹形結構存儲及查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mysql內(nèi)連接與外連接的區(qū)別詳解

    Mysql內(nèi)連接與外連接的區(qū)別詳解

    最近別人問我一個問題:數(shù)據(jù)庫中的左連接和右連接有什么區(qū)別?所以這篇文章主要給大家介紹了關于Mysql內(nèi)連接和外連接區(qū)別的相關資料,需要的朋友可以參考下
    2023-01-01
  • Mysql應用安裝后找不到my.ini文件的解決過程

    Mysql應用安裝后找不到my.ini文件的解決過程

    剛剛在修改mysql默認配置的時候,發(fā)現(xiàn)找不到my.ini文件,下面這篇文章主要給大家介紹了關于Mysql應用安裝后找不到my.ini文件的解決過程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • MySql如何使用not in實現(xiàn)優(yōu)化

    MySql如何使用not in實現(xiàn)優(yōu)化

    這篇文章主要介紹了MySql如何使用not in實現(xiàn)優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • MySQL中的多表查詢與事務操作

    MySQL中的多表查詢與事務操作

    這篇文章主要介紹了MySQL中的多表查詢與事務操作,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • mysql5.5 master-slave(Replication)主從配置

    mysql5.5 master-slave(Replication)主從配置

    在主機master中對test數(shù)據(jù)庫進行sql操作,再查看從機test數(shù)據(jù)庫是否產(chǎn)生同步。
    2011-07-07
  • MySQL索引的一些常見面試題大全(2022年)

    MySQL索引的一些常見面試題大全(2022年)

    索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結構,是對表中一列或多列值進行排序的結構,下面這篇文章主要給大家介紹了關于MySQL索引的一些常見面試題,文中介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 一文帶你了解MySQL之事務隔離級別和MVCC

    一文帶你了解MySQL之事務隔離級別和MVCC

    這篇文章主要帶大家詳細了解一下MySQL之事務隔離級別和MVCC,文中有詳細的代碼示例,具有一定的參考價值,感興趣的同學可以借鑒月u的
    2023-06-06
  • Centos MySQL 5.7安裝、升級教程

    Centos MySQL 5.7安裝、升級教程

    這篇文章主要為大家詳細介紹了Centos MySQL 5.7安裝、升級教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySql學習day03:數(shù)據(jù)表之間的連接、查詢詳解

    MySql學習day03:數(shù)據(jù)表之間的連接、查詢詳解

    這篇文章主要介紹了MySql數(shù)據(jù)表之間的連接、查詢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Mysql 5.6添加修改用戶名和密碼的方法

    Mysql 5.6添加修改用戶名和密碼的方法

    這篇文章主要介紹了Mysql 5.6添加修改用戶名和密碼的方法,需要的朋友可以參考下
    2017-07-07

最新評論

安康市| 屏边| 东兰县| 宁武县| 英德市| 德阳市| 雅江县| 澄城县| 九龙县| 龙口市| 扎赉特旗| 罗山县| 连城县| 谷城县| 辽阳县| 抚松县| 怀安县| 金堂县| 孙吴县| 台东市| 阳东县| 荃湾区| 湛江市| 河津市| 龙陵县| 方山县| 信丰县| 武山县| 云浮市| 吴堡县| 碌曲县| 潍坊市| 南阳市| 毕节市| 屯门区| 黔南| 株洲县| 宝坻区| 明光市| 平湖市| 阜宁县|