2009-10-16 76 views
3

類別表看起來像如下有點:如何獲得某個類別及其子類別(和子子類別)中所有產品的數量?

id -- name -- parent_id 
1 -- Men -- 0 
2 -- Women -- 0 
3 -- Shirts -- 1 
4 -- Half-sleeve -- 3 
5 -- Full-sleeve -- 3 

關係表:

Product_id -- Category Id 
1   -- 2 
2   -- 2 
3   -- 4 .... 

我可以檢索的產品在任何一個類別,它的直接子類輕鬆自如的數量。但是如果有超過2個級別的東西會變得混亂。

所以我的問題是如何獲得男性及其子類別中所有產品的數量。或襯衫及其子類?

任何想法,謝謝。

UPDATE:

我知道有嵌套集模型,但我不是在現在的位置來改變結構上。

回答

3

如果有可能我會檢查出Managing Hierarchical Data in MySQL

一開始很難讓你頭腦發熱,但它使得這樣的任務更容易。

如果你不能做到這一點,你必須做一個遞歸函數,例如:

$prods = 0; 
function getProdsInCat($cat) 
{ 
    global $prods; 

    $prods += mysql_result(mysql_query(SELECT COUNT(`Product_id`) FROM `prod_to_cat` WHERE `Category Id` = '".$cat."'),0); 


    $moreCats = mysql_query("SELECT `cat_id` FROM `cats` WHERE `parent_id` = '".$cat."'"); 
    while($cats = mysql_fetch_assoc($moreCats) 
    { 
     getProdsInCat($cats['cat_id']); 
    } 
} 
+0

分層數據使這很容易,但類別不是那麼容易的維護。我已經在另一個項目中使用了分層結構。 – TigerTiger 2009-10-16 09:05:58

+1

+1那篇文章是我的第一個念頭!我對OP的建議是:重新設計數據結構以滿足要求。 – lexu 2009-10-16 09:07:00

+0

我也剛剛添加了一個遞歸函數的例子,它也將排序問題與當前設置 – Lizard 2009-10-16 09:11:10

1

假設你可以添加一個額外的列的類別表。

表示該列將具有該類別的路徑。

id -- name  -- parent_id path 
1 -- Men   -- 0   0/ 
2 -- Women  -- 0   0/ 
3 -- Shirts  -- 1   0/1 
4 -- Half-sleeve -- 3   0/1/3 
5 -- Full-sleeve -- 3   0/1/3 

這種方式找到所有子類別變成一個查詢:

SELECT id as CatId FROM categories WHERE path LIKE '0/1/%'; 

而獲得的一個類別中的所有產品和兒童的數量是很容易的事:

SELECT count(p.id) as Total 
FROM products as p 
JOIN categories as c ON p.category_id = c.id 
WHERE c.path like '0/1/%'; 

相當有效的查詢。

這篇文章提供了更多信息:More Trees & Hierarchies in SQL

+0

不是一個壞主意! – TigerTiger 2009-10-16 11:59:14

相關問題