MySQL多層級構造-樹搜刮引見。本站提示廣大學習愛好者:(MySQL多層級構造-樹搜刮引見)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL多層級構造-樹搜刮引見正文
望文生義,偽元素就是你的文檔中如有實無的元素。
::first-letter偽元素
格局:
示例:
提醒:假如不消偽元素創立這個首字符縮小後果,必需手工給該字母加上標簽,
然後再為該標簽運用款式。而偽元素現實上是替我們添加了有形的標簽。
::first-line偽元素
格局:
示例:
解釋:選中文本段落(普通情形下是段落)的第一行。
::before和::after偽元素
格局:
示例:
對標志:
添加以下款式:
會獲得以下成果:
Age: 25 years.
提醒:假如標簽中的內容是經由過程數據庫查詢生成的成果,那末用這類技能再適合不外了。
由於一切成果都是數字,應用這兩個偽元素可以在把數字出現給用戶時,加上解釋
性文字。
查找 '節點6' 的一切父節點
思緒: 找出 左值小於 '節點6' 而且 右值年夜於 '節點6' 的節點。
淺顯說法: 找出誰人節點能將 '節點6' 給包住。
-- 取得 '節點6' 父親 SELECT p.* FROM comment AS p, comment AS c WHERE c.left_num BETWEEN p.left_num AND p.right_num AND c.comment_id = 6; +------------+----------+-----------+ | comment_id | left_num | right_num | +------------+----------+-----------+ | 1 | 1 | 14 | | 4 | 6 | 13 | | 6 | 9 | 12 | +------------+----------+-----------+
盤算 '節點4' 的深度
假如是MySQL5.7 須要修正sql_mode
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; SELECT c.*, COUNT(c.comment_id) AS depth FROM comment AS p, comment AS c WHERE c.left_num BETWEEN p.left_num AND p.right_num AND c.comment_id = 4 GROUP BY c.comment_id; +------------+----------+-----------+-------+ | comment_id | left_num | right_num | depth | +------------+----------+-----------+-------+ | 4 | 6 | 13 | 2 | +------------+----------+-----------+-------+
獲得 '節點4' 的一切子節點, 和相干深度
SELECT sub_child.*, (COUNT(sub_parent.comment_id) - 1) AS depth FROM ( SELECT child.* FROM comment AS parent, comment AS child WHERE child.left_num BETWEEN parent.left_num AND parent.right_num AND parent.comment_id = 4 ) AS sub_child, ( SELECT child.* FROM comment AS parent, comment AS child WHERE child.left_num BETWEEN parent.left_num AND parent.right_num AND parent.comment_id = 4 ) AS sub_parent WHERE sub_child.left_num BETWEEN sub_parent.left_num AND sub_parent.right_num GROUP BY sub_child.comment_id ORDER BY sub_child.left_num; +------------+----------+-----------+-------+ | comment_id | left_num | right_num | depth | +------------+----------+-----------+-------+ | 4 | 6 | 13 | 0 | | 5 | 7 | 8 | 1 | | 6 | 9 | 12 | 1 | | 7 | 10 | 11 | 2 | +------------+----------+-----------+-------+
拔出數據
數據的拔出是一件相當費事的事,須要更新節點的一切父節點的右值和和一切孩子節點的 '左值、右值'
如上圖,假如我們想為 '節點4' 添加一個孩子 '節點44'(為了不給本身挖坑,我們將添加的孩子放在父節點的最右邊),就是將 '節點44' 放在 '節點5' 的右邊。以下圖:
終究我們取得的成果,以下圖:
上圖 '紫色' 的是節點須要變革的左值和右值,'綠色' 的是新增節點的值。
更新思緒:
1、將左值年夜於 '節點4' 的左值的節點的左值 加2。
2、將右值年夜於 '節點4' 的左值的節點的右值 加2。
-- 取得 '節點4' 和 '節點4'的第一個孩子的(節點5)的閣下值 SELECT c.* FROM comment AS p, comment AS c WHERE c.left_num BETWEEN p.left_num AND p.right_num AND p.comment_id = 4; +------------+----------+-----------+ | comment_id | left_num | right_num | +------------+----------+-----------+ | 4 | 6 | 13 | | 5 | 7 | 8 | ... omit ... -- 經由過程下面取得的信息更新 '節點4' 的父子幾點的閣下值 UPDATE comment SET left_num = left_num + 2 WHERE left_num > 6; UPDATE comment SET right_num = right_num + 2 WHERE right_num > 6;
拔出思緒
1、將 '節點44' 的左值設置為 '節點4' 的左值 加1
2、將 '節點44' 的右值設置為 '節點4' 的左值 加2
INSERT INTO comment SELECT 44, left_num + 1, left_num + 2 FROM comment WHERE comment_id = 4;
驗證
-- 取得 '節點4' 孩子 SELECT c.* FROM comment AS p, comment AS c WHERE c.left_num BETWEEN p.left_num AND p.right_num AND p.comment_id = 4; +------------+----------+-----------+ | comment_id | left_num | right_num | +------------+----------+-----------+ | 4 | 6 | 15 | | 5 | 9 | 10 | | 6 | 11 | 14 | | 7 | 12 | 13 | | 44 | 7 | 8 | +------------+----------+-----------+ -- 取得 '節點44' 父親 SELECT p.* FROM comment AS p, comment AS c WHERE c.left_num BETWEEN p.left_num AND p.right_num AND c.comment_id = 44; +------------+----------+-----------+ | comment_id | left_num | right_num | +------------+----------+-----------+ | 1 | 1 | 16 | | 4 | 6 | 15 | | 44 | 7 | 8 | +------------+----------+-----------+
1.4. 總結
這類樹構造普通會用在查詢多增長修正少的場景中(好比地域表,種別表之類的)。
在實際中其實還有些表的數據字段許多,而且具有層級關系。然則他們層級關系其實不須要及時的那末精確(終究能到達數據數據一向就行),這是我們會將這類層級關系的字段和主表離開放在別的一個表。如許為了加速更新。假如及時更新影響到了機能,這是我們會斟酌應用kafka(我們還沒有發明機能很差)。