《MYSQL教程MySQL多層級(jí)結(jié)構(gòu)-區(qū)域表使用樹詳解》要點(diǎn):
本文介紹了MYSQL教程MySQL多層級(jí)結(jié)構(gòu)-區(qū)域表使用樹詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
1.1. 前言MYSQL數(shù)據(jù)庫
前面我們大概介紹了一下樹結(jié)構(gòu)表的基本使用.在我們項(xiàng)目中有好幾塊有用到多層級(jí)的概念.下面我們哪大家都比擬熟悉的區(qū)域表來做演示.
1.2. 表結(jié)構(gòu)和數(shù)據(jù)MYSQL數(shù)據(jù)庫
區(qū)域表基本結(jié)構(gòu),可能在你的項(xiàng)目中還有包括其他字段.這邊我只展示我們關(guān)心的字段:MYSQL數(shù)據(jù)庫
CREATE TABLE `area` ( `area_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '地域ID', `name` varchar(40) NOT NULL DEFAULT 'unkonw' COMMENT '地域名稱', `area_code` varchar(10) NOT NULL DEFAULT 'unkonw' COMMENT '地域編碼', `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數(shù)據(jù)庫
mysql -uroot -proot test < area.sqlMYSQL數(shù)據(jù)庫
1.1. 區(qū)域表的根本操作MYSQL數(shù)據(jù)庫
查看 '廣州' 的相關(guān)信息MYSQL數(shù)據(jù)庫
SELECT * FROM area WHERE name LIKE '%廣州%'; +---------+-----------+-----------+------+----------+-----------+ | area_id | name | area_code | pid | left_num | right_num | +---------+-----------+-----------+------+----------+-----------+ | 2148 | 廣州市 | 440100 | 2147 | 2879 | 2904 | +---------+-----------+-----------+------+----------+-----------+
查看 '廣州' 所有孩子MYSQL數(shù)據(jù)庫
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)系MYSQL數(shù)據(jù)庫
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 | +---------+-------------+-------+
顯示 '廣州' 的直系祖先(包含自己)MYSQL數(shù)據(jù)庫
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ū)'MYSQL數(shù)據(jù)庫
-- 更新左右值 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 | +---------+-----------+-----------+------+----------+-----------+
維易PHP培訓(xùn)學(xué)院每天發(fā)布《MYSQL教程MySQL多層級(jí)結(jié)構(gòu)-區(qū)域表使用樹詳解》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11925.html