mysql 層次資料 mysql中的層次資料

2021-10-17 11:27:13 字數 1684 閱讀 6734

您希望獲得父id:

所以假設你得到了

set @parentid = 1 /*toys*/

select

from

items i

inner join categories c on c.id = i.categoryid

where

c.parentid = @parentid

這將給你想要的專案-乙個主要的設計缺陷:它不處理多層次的類別。

假設您有乙個categories表:

*categories table*

id | name | parentid

1 | toys | 0

2 | dolls | 1

3 | bikes | 1

4 | models | 2

5 | act.fig.| 2

6 | mountain| 3

7 | bmx | 3

專案:*items table*

item | category_id

barbie | 4

gijoe | 5

schwinn| 6

huffy | 7

獲取所有相關項的唯一方法是執行自連線:

select

from

items i

inner join categories c on c.id = i.categoryid

inner join categories c2 on c.parentid = c2.id

where

c2.parentid = @parentid

這種模式是不可伸縮的,因為您可以有多個層次結構。

處理層次結構的一種常見方法是構建乙個「扁平」表:將每個節點鏈結到其所有子節點的行。

除了categories表之外,還可以構建第二個表:

*categoriesflat table* the name column is here only for readability

id | name | parentid

1 | toys | 1

2 | dolls | 1

2 | dolls | 2

4 | models | 1

4 | models | 2

4 | models | 4

5 | act.fig.| 1

5 | act.fig.| 2

5 | act.fig.| 5

3 | bikes | 1

3 | bikes | 3

6 | mountain| 1

6 | mountain| 3

6 | mountain| 6

7 | bmx | 1

7 | bmx | 3

7 | bmx | 7

所以你可以寫:

select

from

items i

inner join categoriesflat c on c.id = i.categoryid

where

c.parentid = @parentid

並得到所有相關的類別和專案。

這裡有乙個

great slideshow about sql anti-patterns

以及解決辦法。(sql中的分層資料是一種反模式,但不要灰心——我們都遇到過這種情況)

Odoo中的層次資料組織

本人實在 看到的該篇部落格,但具體的出處沒有找到。parent name location id parent store true parent order name 其中 parent name是指當前筆資料的父資料id欄位 預設值是parent id parent store表示使用paren...

MySQL攻擊次數

簡介 在第一次進行資料庫插入資料的時候,過濾不嚴格,在寫入資料庫的時候還是保留了原來的資料,但是資料本身還是惡意資料。在將資料存入到了資料庫中之後,開發者就認為資料是可信的。在下一次進行需要進行查詢的時候,直接從資料庫中取出了髒資料,沒有進行進一步的檢驗和處理,這樣就會造成sql的二次注入。比如在第...

mysql 結構層次

了解mysql必須牢牢記住其體系結構圖,mysql是由sql介面,解析器,優化器,快取,儲存引擎組成的。img 1 connectors指的是不同語言中與sql的互動 2 management serveices utilities 系統管理和控制工具 3 connection pool 連線池 管...