鍍金池/ 問答/PHP  數(shù)據(jù)庫/ mysql 查詢分類下的所有商品

mysql 查詢分類下的所有商品

尋求一個解決方案:
有一個分類,下面可能有無限級子分類,暫定5級子分類吧!那如果用戶點擊頂級分類,怎么查出該分類下的所有商品,這個頂級分類下的樹形結(jié)構(gòu)分類可能有上千個子分類,如果按照頂級分類查出所有子分類,然后通過mysql的catid去用IN查詢,肯定會掛掉
請問各位大神如何解決這種需求,數(shù)據(jù)結(jié)構(gòu)方面怎么設(shè)計呢?或者什么解決算法,用的是PHP

回答
編輯回答
負我心

剛網(wǎng)上搜到一個比較不高大上的方法,但是我覺得可行,不知道還有沒有比這更好的方法,就是所有子分類用一個字段記錄他所有的父級id,有多少就記錄多少,查詢的時候用find_in_set,不過這個函數(shù)貌似很慢,繼續(xù)關(guān)注大神們的回答

2017年11月13日 00:01
編輯回答
厭遇

如果注重查詢效率的話可以考慮MPTT - Modified Preorder Tree Traversal

2018年2月18日 12:52
編輯回答
柚稚

我們一般設(shè)計都是需要有一個字段記錄他的上級id,如果是頂級就是0,然后遞歸查詢無限極分類

2017年1月23日 19:48
編輯回答
瘋浪

給個思路。以空間換時間,就是冗余。
舉個例子,一下是分類

  • 電器 cat_id = 1

    • 電腦 cat_id = 2 pid = 1
    • 手機 cat_id = 3 pid = 1

      • 蘋果手機 cat_id =4 pid =3

那么 有個 商品 iphone 8 ,商品ID goods_id G1001

可以兩種方案都可以搞定。
第一做中間表
cat_id goods_id
1 G1001
3 G1001
4 G1001
這樣,如果你是到哪個分類下,都可以找到該商品

第二種做多級字段
catid_string 1,3,4
做查詢的時候 比如說找電器 , 只要 where catid_string LIKE "1%"
找手機 where catid_string LIKE "1,3%"

以上兩種方法都可以適合做查詢
但是第一種方法可以更好的做各種業(yè)務(wù)拓展,更有選擇的余地。

2018年2月4日 17:53
編輯回答
孤客

閉包表,單獨用一個表來記錄全部的祖先關(guān)系。

CREATE TABLE `tree`  (
  `ancestor` int NOT NULL COMMENT '祖先ID(分類ID)',
  `descendant` int NOT NULL COMMENT '后代ID',
  `descendant_type` tinyint NOT NULL COMMENT '后代類型(0分類,1商品)',
  PRIMARY KEY (`ancestor`, `descendant`, `descendant_type`)
);

要查某個分類的下的全部商品id:

select descendant from tree where ancestor = 10 and descendant_type = 1;

要查出商品信息就關(guān)聯(lián)查詢:

select p.* from products p 
  join tree t on p.id = t.descendant 
  where t.ancestor = 10 and t.descendant_type = 1

當然,增刪分類和商品的時候要修改閉包表。

《SQL反模式》里總結(jié)的一個表:

clipboard.png

2017年2月1日 20:14