2012-01-09 55 views
0

使用mysql(和php)我嘗試隱藏選擇菜單 類別的項目選擇不可用。 基本上我卡住了,不能做到這一點。mysql:選擇菜單 - 取消選擇所有類別不存在於結果中

Asos使用此技術瀏覽低谷產品(http://www.asos.com/Men/Jeans/Cat/pgecategory.aspx?cid=4208)。

要清楚的問題不是如何做ajax的東西,但如何有效地使用MySQL和PHP來製作這樣的系統。

我試圖找出嵌套組要做到這一點:

(1)items(22)---------------------------------- 
      |       | 
      |       | 
    (2)producs(7)     (8)origin(21) 
      |       | 
(3)single(4)-(5)bundle(6)    | 
          --------------------- 
          |     | 
          (9)EU(14)  (15)ASIA(20) 
          |     | 
          ----------------  ----------------- 
          |    |   |    | 
         (10)DU(11) (12)PL(13) (16)CN(17) (18)JP(19) 

菜單:
類型:
-single
-bundle

產地:
- 歐盟
-ASIA

國家:
-DU
-PL
-CN
-jP

比方說,有一個在DB一個項目: 項目 '1' 是:
-single
- 歐盟
-DU

項目類別表:

itemID - cat_lft - cat_rgt 
    1  10  11 
    1  7   12 
    1  2   3 

在菜單中選擇杜應選擇:
DU-EU單

,然後再取消其餘的(返回數組?),因爲那裏有是隻有一個項目現在。

你可以得到的項目,如果比較的結果是出現在其餘類別的,但是這聽起來像使用大量查詢的的...

任何意見,從哪裏走?

+0

您如何將產品與嵌套集中的特定類別關聯?我假設每個類別都有左/右描述符,但是每個類別都有一個ID,然後產品與類別表是多對多的? – landons 2012-01-09 03:32:09

+0

我已經向操作添加了一個示例。 – Rob 2012-01-09 03:43:46

+0

我不認爲你的嵌套set lft/rgt值是正確的。歐盟不應該是7/8,因爲這將表明它是一片葉子,而不是一個分支... – landons 2012-01-09 03:58:00

回答

1

下面是我該怎麼做。確保您的產品僅以葉子分類(即left = right + 1)。因此,產品可以分類爲「DU」,但不是「原產地」或「亞洲」。「

分類表:

  • CATEGORY_ID
  • 離開

Products表:

  • PRODUCT_ID
  • ...

Categories_Products表:

  • CATEGORY_ID
  • PRODUCT_ID

SQL查詢,以確定檢查與選中類別:

SELECT 
    `categories`.`category_id`, 
    `categories`.`name`, 
    IFNULL(COUNT(`categories_products`.`id`), 0) AS `count` FROM `categories` 

LEFT JOIN `categories` as `children` ON 
    `children`.`left` > `categories`.`left` AND 
    `children`.`right` < `categories`.`right` 

JOIN `categories_products` ON 
    `categories_products`.`category_id` = `children`.`category_id` 

GROUP BY `categories`.`category_id` 

如果 「數」 爲0時,不要選擇它;否則,它會被檢查,並且您知道該類別中有多少物品。這是未經測試的,所以它可能需要一些調整。您明確希望category_id,product_id,left和right列上的索引。

加法:SQL查詢來選擇產品在一個或多個類別(參見下面的化合物的條件):

SELECT `products`.* FROM `categories` 

JOIN `categories` as `children` ON 
    `children`.`left` >= `categories`.`left` AND 
    `children`.`right` <= `categories`.`right` 

JOIN `categories_products` ON 
    `categories_products`.`category_id` = `children`.`category_id` 

JOIN `products` ON 
    `products`.`product_id` = `categories_products`.`product_id` 

WHERE `categories`.`category_id` IN (1,2,3,n,...) 

GROUP BY `products`.`product_id` 

加法:邏輯選擇產品在多個類別,化合物過濾(產品必須在所有類別中匹配):

您必須爲所需的每個類別要求分別進行連接。請注意,這種類型的查詢可能會非常緩慢,所以在進行一些基準測試時也是如此。用多個查詢(每個類別一個查詢)可能會更好,並將結果結合到應用程序代碼中。

沿着這些相同的路線,我建議像「single vs. bundle」這樣的東西在你的產品表中是一個ENUM,而分類留給更抽象的結構(地區作品,以及傳統的面向消費者,「邏輯」分類結構),這不是一個簡單的/或標誌。

+0

不錯,我要試一試 – Rob 2012-01-09 04:01:39

+0

的確顯示(作品!)哪些類別與產品相關聯(so你知道這個類別中有多少物品)。感謝您的幫助。有關如何顯示類別中的哪些項目(或不是)的任何提示?以及如何根據選定的類別進行查詢。 – Rob 2012-01-09 05:35:32

+0

我已經更新了我的答案,並根據類別選擇了一些產品 – landons 2012-01-09 21:13:43

相關問題