国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL多層級結(jié)構(gòu)-區(qū)域表使用樹詳解

2024-07-24 13:10:02
字體:
供稿:網(wǎng)友

1.1. 前言

前面我們大概介紹了一下樹結(jié)構(gòu)表的基本使用。在我們項(xiàng)目中有好幾塊有用到多層級的概念。下面我們哪大家都比較熟悉的區(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 cWHERE 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 |+---------+-----------+-----------+------+----------+-----------+

查看 '廣州' 所有孩子 和 深度 并顯示層級關(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 nameFROM ( 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_parentWHERE sub_child.left_num BETWEEN sub_parent.left_num AND sub_parent.right_numGROUP BY sub_child.area_idORDER 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 cWHERE 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 areaSELECT NULL, '南沙區(qū)', '440115', 2148, left_num + 1, left_num + 2FROM area WHERE area_id = 2148; -- 查看是否滿足要求SELECT c.* FROM area AS p, area AS cWHERE 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 |+---------+-----------+-----------+------+----------+-----------+
 


注:相關(guān)教程知識(shí)閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 遵义市| 吴旗县| 石棉县| 北碚区| 云梦县| 宁武县| 宣城市| 迭部县| 兴山县| 靖安县| 佛学| 铜梁县| 壶关县| 双流县| 古浪县| 张家港市| 拜城县| 莲花县| 博罗县| 综艺| 乌拉特后旗| 长兴县| 沐川县| 岐山县| 英吉沙县| 巴彦淖尔市| 昌邑市| 昂仁县| 渝中区| 花莲县| 开平市| 恩平市| 从江县| 新河县| 峨山| 绵竹市| 来凤县| 莱西市| 瑞昌市| 江川县| 林甸县|