程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL多層級構造-樹搜刮引見

MySQL多層級構造-樹搜刮引見

編輯:MySQL綜合教程

MySQL多層級構造-樹搜刮引見。本站提示廣大學習愛好者:(MySQL多層級構造-樹搜刮引見)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL多層級構造-樹搜刮引見正文


望文生義,偽元素就是你的文檔中如有實無的元素。
::first-letter偽元素

格局:

    
  • e::first-letter  
  • 示例:

        
  • p::first-letter {font-size:300%;}  
  •     提醒:假如不消偽元素創立這個首字符縮小後果,必需手工給該字母加上標簽,
        然後再為該標簽運用款式。而偽元素現實上是替我們添加了有形的標簽。

    ::first-line偽元素

    格局:

        
  • e::first-line  
  • 示例:

        
  • p::first-line {font-variant:small-caps;}  
  • 解釋:選中文本段落(普通情形下是段落)的第一行。

    ::before和::after偽元素

    格局:

        
  • e::before   
  • e::after  
  • 示例:
    對標志:

        
  • <p class="age">25</p>  
  • 添加以下款式:

        
  • p.age::before {content:"Age: ";}   
  • p.age::after {content:" years.";}  
  • 會獲得以下成果:

    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(我們還沒有發明機能很差)。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved