日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql将权限分为几个层级_MySQL多层级结构-区域表使用树详解

發(fā)布時(shí)間:2025/3/20 数据库 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql将权限分为几个层级_MySQL多层级结构-区域表使用树详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.1. 前言

前面我們大概介紹了一下樹結(jié)構(gòu)表的基本使用。在我們項(xiàng)目中有好幾塊有用到多層級(jí)的概念。下面我們哪大家都比較熟悉的區(qū)域表來做演示。

1.2. 表結(jié)構(gòu)和數(shù)據(jù)

區(qū)域表基本結(jié)構(gòu),可能在你的項(xiàng)目中還有包含其他字段。這邊我只展示我們關(guān)心的字段: CREATE TABLE `area` (

`area_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '地區(qū)ID',

`name` varchar(40) NOT NULL DEFAULT 'unkonw' COMMENT '地區(qū)名稱',

`area_code` varchar(10) NOT NULL DEFAULT 'unkonw' COMMENT '地區(qū)編碼',

`pid` int(11) DEFAULT NULL COMMENT '父id',

`left_num` mediumint(8) unsigned NOT NULL COMMENT '節(jié)點(diǎn)左值',

`right_num` mediumint(8) unsigned NOT NULL COMMENT '節(jié)點(diǎn)右值',

PRIMARY KEY (`area_id`),

KEY `idx$area$pid` (`pid`),

KEY `idx$area$left_num` (`left_num`),

KEY `idx$area$right_num` (`right_num`)

)

區(qū)域表數(shù)據(jù): area

導(dǎo)入到test表

mysql -uroot -proot test < area.sql

1.1. 區(qū)域表的基本操作

查看 '廣州' 的相關(guān)信息 SELECT * FROM area WHERE name LIKE '%廣州%';

+---------+-----------+-----------+------+----------+-----------+

| area_id | name | area_code | pid | left_num | right_num |

+---------+-----------+-----------+------+----------+-----------+

| 2148 | 廣州市 | 440100 | 2147 | 2879 | 2904 |

+---------+-----------+-----------+------+----------+-----------+

查看 '廣州' 所有孩子 SELECT c.*

FROM area AS p, area AS c

WHERE c.left_num BETWEEN p.left_num AND p.right_num

AND p.area_id = 2148;

+---------+-----------+-----------+------+----------+-----------+

| area_id | name | area_code | pid | left_num | right_num |

+---------+-----------+-----------+------+----------+-----------+

| 2148 | 廣州市 | 440100 | 2147 | 2879 | 2904 |

| 2161 | 從化市 | 440184 | 2148 | 2880 | 2881 |

| 2160 | 增城市 | 440183 | 2148 | 2882 | 2883 |

| 2159 | 花都區(qū) | 440114 | 2148 | 2884 | 2885 |

| 2158 | 番禺區(qū) | 440113 | 2148 | 2886 | 2887 |

| 2157 | 黃埔區(qū) | 440112 | 2148 | 2888 | 2889 |

| 2156 | 白云區(qū) | 440111 | 2148 | 2890 | 2891 |

| 2154 | 天河區(qū) | 440106 | 2148 | 2892 | 2893 |

| 2153 | 海珠區(qū) | 440105 | 2148 | 2894 | 2895 |

| 2152 | 越秀區(qū) | 440104 | 2148 | 2896 | 2897 |

| 2151 | 荔灣區(qū) | 440103 | 2148 | 2898 | 2899 |

| 2150 | 東山區(qū) | 230406 | 2148 | 2900 | 2901 |

| 2149 | 其它區(qū) | 440189 | 2148 | 2902 | 2903 |

+---------+-----------+-----------+------+----------+-----------+

查看 '廣州' 所有孩子 和 深度 并顯示層級(jí)關(guān)系 SELECT sub_child.area_id,

(COUNT(sub_parent.name) - 1) AS depth,

CONCAT(REPEAT(' ', (COUNT(sub_parent.name) - 1)), sub_child.name) AS name

FROM (

SELECT child.*

FROM area AS parent, area AS child

WHERE child.left_num BETWEEN parent.left_num AND parent.right_num

AND parent.area_id = 2148

) AS sub_child, (

SELECT child.*

FROM area AS parent, area AS child

WHERE child.left_num BETWEEN parent.left_num AND parent.right_num

AND parent.area_id = 2148

) AS sub_parent

WHERE sub_child.left_num BETWEEN sub_parent.left_num AND sub_parent.right_num

GROUP BY sub_child.area_id

ORDER BY sub_child.left_num;

+---------+-------------+-------+

| area_id | name | depth |

+---------+-------------+-------+

| 2148 | 廣州市 | 0 |

| 2161 | 從化市 | 1 |

| 2160 | 增城市 | 1 |

| 2159 | 花都區(qū) | 1 |

| 2158 | 番禺區(qū) | 1 |

| 2157 | 黃埔區(qū) | 1 |

| 2156 | 白云區(qū) | 1 |

| 2154 | 天河區(qū) | 1 |

| 2153 | 海珠區(qū) | 1 |

| 2152 | 越秀區(qū) | 1 |

| 2151 | 荔灣區(qū) | 1 |

| 2150 | 東山區(qū) | 1 |

| 2149 | 其它區(qū) | 1 |

+---------+-------------+-------+

顯示 '廣州' 的直系祖先(包括自己) SELECT p.*

FROM area AS p, area AS c

WHERE c.left_num BETWEEN p.left_num AND p.right_num

AND c.area_id = 2148;

+---------+-----------+-----------+------+----------+-----------+

| area_id | name | area_code | pid | left_num | right_num |

+---------+-----------+-----------+------+----------+-----------+

| 2147 | 廣東省 | 440000 | 0 | 2580 | 2905 |

| 2148 | 廣州市 | 440100 | 2147 | 2879 | 2904 |

| 3611 | 中國 | 100000 | -1 | 1 | 7218 |

+---------+-----------+-----------+------+----------+-----------+

向 '廣州' 插入一個(gè)地區(qū) '南沙區(qū)' -- 更新左右值

UPDATE area SET left_num = left_num + 2 WHERE left_num > 2879;

UPDATE area SET right_num = right_num + 2 WHERE right_num > 2879;

-- 插入 '南沙區(qū)' 信息

INSERT INTO area

SELECT NULL, '南沙區(qū)', '440115', 2148, left_num + 1, left_num + 2

FROM area WHERE area_id = 2148;

-- 查看是否滿足要求

SELECT c.*

FROM area AS p, area AS c

WHERE c.left_num BETWEEN p.left_num AND p.right_num

AND p.area_id = 2148;

+---------+-----------+-----------+------+----------+-----------+

| area_id | name | area_code | pid | left_num | right_num |

+---------+-----------+-----------+------+----------+-----------+

| 2148 | 廣州市 | 440100 | 2147 | 2879 | 2906 |

| 3612 | 南沙區(qū) | 440115 | 2148 | 2880 | 2881 |

| 2161 | 從化市 | 440184 | 2148 | 2882 | 2883 |

| 2160 | 增城市 | 440183 | 2148 | 2884 | 2885 |

| 2159 | 花都區(qū) | 440114 | 2148 | 2886 | 2887 |

| 2158 | 番禺區(qū) | 440113 | 2148 | 2888 | 2889 |

| 2157 | 黃埔區(qū) | 440112 | 2148 | 2890 | 2891 |

| 2156 | 白云區(qū) | 440111 | 2148 | 2892 | 2893 |

| 2154 | 天河區(qū) | 440106 | 2148 | 2894 | 2895 |

| 2153 | 海珠區(qū) | 440105 | 2148 | 2896 | 2897 |

| 2152 | 越秀區(qū) | 440104 | 2148 | 2898 | 2899 |

| 2151 | 荔灣區(qū) | 440103 | 2148 | 2900 | 2901 |

| 2150 | 東山區(qū) | 230406 | 2148 | 2902 | 2903 |

| 2149 | 其它區(qū) | 440189 | 2148 | 2904 | 2905 |

+---------+-----------+-----------+------+----------+-----------+

總結(jié)

以上是生活随笔為你收集整理的mysql将权限分为几个层级_MySQL多层级结构-区域表使用树详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。