資料庫設計分類、目錄等等的結構,要去考量有幾個階層,當階層不明確,或者階層很多,通常會用下述設計方式(想要幾個階層都可以):
- cate_id / cate_name / cate_parent_id (預設 cate_parent_id = 0)
依照這種設計法,每次查詢就一直找到自己的父節點id,當找到 cate_parent_id = 0 就找到最上層了
這種作法就會需要寫個 while 一直往上查詢上去,有沒有辦法一行 SQL 語法直接達成呢?
MySQL 多層的目錄階層 一次查詢完成
此篇文章 How to create a MySQL hierarchical recursive query 有更多 Category 的設計方式與作法(分類使用 LIKE / Recursive / Self-Join 的方式,此篇採用的是 Self-Join 的方式)
Table Name 是 category 下述 SQL 語法應該一看就懂
- SELECT * FROM category AS t1
LEFT JOIN category AS t2 ON t2.cate_parent_id = t1.cate_id
LEFT JOIN category AS t3 ON t3.cate_parent_id = t2.cate_id; - SELECT t1.cate_name, t2.cate_name, t3.cate_name FROM category AS t1
LEFT JOIN category AS t2 ON t2.cate_parent_id = t1.cate_id
LEFT JOIN category AS t3 ON t3.cate_parent_id = t2.cate_id
若文章與分類中間有一個 Table 做 Mapping,要一次撈出文章順便把分類階層一次搞定:
- SELECT * FROM news, news_cate, category AS t1
LEFT JOIN category AS t2 ON t2.cate_parent_id = t1.cate_id
LEFT JOIN category AS t3 ON t3.cate_parent_id = t2.cate_id
WHERE news.news_id = news_cate.ad_id and news_cate.cate_id = t1.cate_id limit 30;
相關網頁
也可以參考看看這篇 ( MPTT )
https://www.sitepoint.com/hierarchical-data-database-2/
效率很不錯 ~~
感謝,我來補上去~
兩個的資料結構不太一樣喔
MPTT 可以一個 query 拉出整隻樹的結構 or 從某一個 node 直接拉到 root
node 多的時後更新會比較花時間, 但查詢的時後都是 log(n)
嗯嗯,查詢的速度是很快的,缺點是增加節點每次都要 rebuild tree
不過 category 本來就是讀多寫少的,rebuild tree 花的 cost 是值得的~