當前位置:首頁 » 存儲配置 » mysql存儲樹形

mysql存儲樹形

發布時間: 2022-07-20 13:50:46

『壹』 怎麼往資料庫里插入一個樹形結構的表,並且用一句sql語句將其遍歷出來

ID Value PID
0 根節點 null
1 節點1 0
2 節點2 0
3 節點3 1
..........

然後查詢出來 再形成樹就可以了

『貳』 jsp怎麼從mysql資料庫把樹形結構展現出來

看你是怎麼設計的,一般這個跟數據設計有關系,還有跟前端也有關系,前端顯示有樹的框架,這樣的話資料庫只需要跟前端框架給出的結構存儲即可,界面上jstl或者js渲染都可以。

『叄』 怎樣在 mysql 表中存儲樹形結構數據

解決方法很多!數據要存儲為樹形結構,那麼數據要有父子關系。 一個父節點有多個子節點,一個子節點又有多個子子節點。 publicclassTreeNode{ /**節點主鍵**/ privateStringid; /**節點名稱**/ privateStringtext; /**子節點**/ privateTreeNode[]children; }

『肆』 怎樣在 MySQL 表中存儲樹形結構數據

一般比較普遍的就是四種方法:(具體見 SQL Anti-patterns這本書)
Adjacency List:每一條記錄存parent_id
Path Enumerations:每一條記錄存整個tree path經過的node枚舉
Nested Sets:每一條記錄存 nleft 和 nright
Closure Table:維護一個表,所有的tree path作為記錄進行保存。

『伍』 怎樣在 MySQL 表中存儲樹形結構數據

一般比較普遍的就是四種方法:

(具體見 SQL Anti-patterns這本書)Adjacency List:

每一條記錄存parent_idPath Enumerations:

每一條記錄存整個tree path經過的node枚舉Nested Sets:

每一條記錄存 nleft 和 nrightClosure Table:

維護一個表,所有的tree path作為記錄進行保存。各種方法的常用操作代價見下圖

『陸』 怎樣在 MySQL 表中存儲樹形結構數據

很高興為您解答。一般比較普遍的就是四種方法:(具體見SQLAnti-patterns這本書)Adjacency List:每一條記錄存parent_idPath Enumerations:每一條記錄存整個tree path經過的node枚舉Nested Sets:每一條記錄存 nleft 和 nrightClosure Table:維護一個表,所有的tree path作為記錄進行保存。各種方法的常用操作代價見下圖


如若滿意,請點擊右側【採納回答】,如若還有問題,請點擊【追問】希望我的回答對您有所幫助,望採納!

『柒』 怎麼將資料庫中存的樹轉化為樹形列表

樹狀結構的數據保存在資料庫中的常用方法有一下兩種:
1、鄰接表(adjacency list model)
2、預排序遍歷樹演算法(modified preorder tree traversal algorithm)

用一下的例子討論這兩種方法的差異:

現有一棵樹如下:

鄰接表模式:
這種模式我們經常用到,很多的教程和書中也介紹過。我們通過給每個節點增加一個屬性 parent 來表示這個節點的父節點從而將整個樹狀結構通過平面的表描述出來。根據這個原則,例子中的數據可以轉化成如下的表:

我們看到 Pear 是Green的一個子節點,Green是Fruit的一個子節點。而根節點'Food'沒有父節點。 為了簡單地描述這個問題, 這個例子中只用了name來表示一個記錄。 在實際的資料庫中,你需要用數字的id來標示每個節點,資料庫的表結構大概應該像這樣:id, parent_id, name, description。
以下是代碼:
<?php
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
// used to display a nice indented tree

function display_children($parent, $level)
{
// 獲得一個 父節點 $parent 的所有子節點
$result = mysql_query('SELECT name FROM tree '.
'WHERE parent="'.$parent.'";');

// 顯示每個子節點
while ($row = mysql_fetch_array($result))
{
// 縮進顯示節點名稱
echo str_repeat(' ',$level).$row['name']."n";

//再次調用這個函數顯示子節點的子節點

display_children($row['name'], $level+1);
}
}
?>

對整個結構的根節點(Food)使用這個函數就可以列印出整個多級樹結構,由於Food是根節點它的父節點是空的,所以這樣調用: display_children('',0)。將顯示整個樹的內容:
Food
Fruit
Red
Cherry
Yellow
Banana
Meat
Beef

Pork
如果你只想顯示整個結構中的一部分,比如說水果部分,就可以這樣調用:display_children('Fruit',0);

幾乎使用同樣的方法我們可以知道從根節點到任意節點的路徑。比如 Cherry 的路徑是"Food >; Fruit >; Red"。 為了得到這樣的一個路徑我們需要從最深的一級"Cherry"開始, 查詢得到它的父節點"Red"把它添加到路徑中, 然後我們再查詢Red的父節點並把它也添加到路徑中,以此類推直到最高層的"Food"
以下是代碼:

<?php
// $node 是那個最深的節點
function get_path($node)
{
// 查詢這個節點的父節點
$result = mysql_query('SELECT parent FROM tree '.
'WHERE name="'.$node.'";');
$row = mysql_fetch_array($result);

// 用一個數組保存路徑
$path = array();

// 如果不是根節點則繼續向上查詢
// (根節點沒有父節點)
if ($row['parent']!='')
{
// the last part of the path to $node, is the name
// of the parent of $node
$path[] = $row['parent'];

// we should add the path to the parent of this node
// to the path
$path = array_merge(get_path($row['parent']), $path);
}

// return the path
return $path;
}
?>

如果對"Cherry"使用這個函數:print_r(get_path('Cherry')),就會得到這樣的一個數組了:
Array
(
[0] =>; Food
[1] =>; Fruit
[2] =>; Red
)
接下來如何把它列印成你希望的格式,就是你的事情了。
缺點:
這種方法很簡單,容易理解,好上手。但是也有一些缺點。主要是因為運行速度很慢,由於得到每個節點都需要進行資料庫查詢,數據量大的時候要進行很多查詢才能完成一個樹。另外由於要進行遞歸運算,遞歸的每一級都需要佔用一些內存所以在空間利用上效率也比較低。

預排序遍歷樹演算法

現在讓我們看一看另外一種不使用遞歸計算,更加快速的方法,這就是預排序遍歷樹演算法(modified preorder tree traversal algorithm) 這種方法大家可能接觸的比較少,初次使用也不像上面的方法容易理解,但是由於這種方法不使用遞歸查詢演算法,有更高的查詢效率。

我們首先將多級數據按照下面的方式畫在紙上,在根節點Food的左側寫上 1 然後沿著這個樹繼續向下 在 Fruit 的左側寫上 2 然後繼續前進,沿著整個樹的邊緣給每一個節點都標上左側和右側的數字。最後一個數字是標在Food 右側的 18。 在下面的這張圖中你可以看到整個標好了數字的多級結構。(沒有看懂?用你的手指指著數字從1數到18就明白怎麼回事了。還不明白,再數一遍,注意移動你的手指)。
這些數字標明了各個節點之間的關系,"Red"的號是3和6,它是 "Food" 1-18 的子孫節點。 同樣,我們可以看到 所有左值大於2和右值小於11的節點 都是"Fruit" 2-11 的子孫節點

這樣整個樹狀結構可以通過左右值來存儲到資料庫中。繼續之前,我們看一看下面整理過的數據表。

注意:由於"left"和"right"在 SQL中有特殊的意義,所以我們需要用"lft"和"rgt"來表示左右欄位。 另外這種結構中不再需要"parent"欄位來表示樹狀結構。也就是 說下面這樣的表結構就足夠了。
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;

看到了吧,只要一個查詢就可以得到所有這些節點。為了能夠像上面的遞歸函數那樣顯示整個樹狀結構,我們還需要對這樣的查詢進行排序。用節點的左值進行排序:
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;

那麼某個節點到底有多少子孫節點呢?很簡單,子孫總數=(右值-左值-1)/2
descendants = (right – left - 1) / 2 ,如果不是很清楚這個公式,那就去翻下書,我們在上數據結構寫的很清楚!

添加同一層次的節點的方法如下:
LOCK TABLE nested_category WRITE;

SELECT @myRight := rgt FROM nested_category WHERE name = 'Cherry';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category(name, lft, rgt) VALUES('Strawberry', @myRight + 1, @myRight + 2);

UNLOCK TABLES;

添加樹的子節點的方法如下:
LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft FROM nested_category WHERE name = 'Beef';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft;

INSERT INTO nested_category(name, lft, rgt) VALUES('charqui', @myLeft + 1, @myLeft + 2);

UNLOCK TABLES;

每次插入節點之後都可以用以下SQL進行查看驗證:
SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

刪除節點的方法,稍微有點麻煩是有個中間變數,如下:
LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category WHERE name = 'Cherry';

DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;

UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight;

UNLOCK TABLES;

這種方式就是有點難的理解,但是適合數據量很大規模使用,查看所有的結構只需要兩條SQL語句就可以了,在添加節點和刪除節點的時候略顯麻煩,不過相對於效率來說還是值得的。

熱點內容
安卓結束腳本 發布:2024-05-28 20:40:08 瀏覽:66
本地ubuntu伺服器搭建 發布:2024-05-28 20:40:03 瀏覽:100
地下城yg腳本 發布:2024-05-28 20:34:20 瀏覽:13
python元組刪除 發布:2024-05-28 20:32:46 瀏覽:794
微信拍了拍安卓怎麼用 發布:2024-05-28 20:18:08 瀏覽:704
cmd執行sql 發布:2024-05-28 19:46:51 瀏覽:866
棧初始化演算法 發布:2024-05-28 19:35:25 瀏覽:930
手機視頻怎麼上傳到qq空間 發布:2024-05-28 19:34:41 瀏覽:218
ftp三劍客作用 發布:2024-05-28 19:34:40 瀏覽:845
define在c語言中 發布:2024-05-28 19:23:44 瀏覽:349