您希望獲得父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 連線池 管...