多級分類我們接觸不少了常用於產品分類,文章分類之類的,今天我們來看看常規多級分類(產品分類,文章分類)在mysql中的存儲方式的一篇文章,希望對各位有幫助。
在日常工作中,我們會經常碰到產品分類,文章分類等等修改不頻繁
的多級分類。通常的做法是類似於這樣的結構:
常規做法

如果按照多級查詢的話,采用以下sql語句就可以:
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

缺點:
代碼如下
復制代碼
舉一個實際的例子吧--產品分類一共三級,所有的產品關聯的分類均是第三級葉子節點。現在的需求是,通過頂級分類,查詢所有這個大分類下包含的產品?
左值右值方法
那我們來看看這種方式,先看原理吧

我們用嵌套的方式來表達多層關系,建表的時候加上左右值,結構如下:

那這時候你肯定會問,左右值是怎麼計算出來的?請接著看下面張圖:

估計你看完這兩張圖後,就明白其中的技巧了,那我們來看看這樣的結構有什麼好處?
我們來解決常規做法中的那個產品分類的問題
代碼如下
復制代碼
假設頂級分類選擇的就是根節點,然後要查詢所有旗下的產品
select category_id from category where lft>1 and rgt<20
要是想查詢子樹也是同樣的道理~
代碼如下
復制代碼
擴展一下,還可以給每條記錄加入父節點id字段,這樣也就擁有了基礎方法的屬性
缺點:
代碼如下
復制代碼
如果要加入和刪除一個節點,就要重新對所有節點進行左值右值計算!!!