MySQL 多層的目錄階層 一次查詢完成

資料庫設計分類、目錄等等的結構,要去考量有幾個階層,當階層不明確,或者階層很多,通常會用下述設計方式(想要幾個階層都可以):

  • 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;

相關網頁

Save

Save

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈MySQL 多層的目錄階層 一次查詢完成〉中有 4 則留言

  1. 兩個的資料結構不太一樣喔
    MPTT 可以一個 query 拉出整隻樹的結構 or 從某一個 node 直接拉到 root
    node 多的時後更新會比較花時間, 但查詢的時後都是 log(n)

    1. 嗯嗯,查詢的速度是很快的,缺點是增加節點每次都要 rebuild tree

      不過 category 本來就是讀多寫少的,rebuild tree 花的 cost 是值得的~

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料