2012-10-14 36 views
1

我基本上試圖做一個類別列表,其中將有一個類別及其子類別的數組。如何獲取父母和孩子分類項目?

我當前的查詢是:

SELECT category.lc_name AS name,COUNT(listings.ls_cat_id) AS post_count 
FROM listings_categories AS category 
LEFT JOIN listings ON listings.ls_cat_id = category.lc_id 
GROUP BY category.lc_id ORDER BY name ASC 

它工作得很好,但是我想在子類項目或崗位數要添加到它的父類。

例如:

id | category | parent | Count 
1  Auto  0  3 
2  Auto A  1  1 
3  Auto B  1  1 
4  Auto C  1  1 

我能做到這一點有什麼MySQL中只使用一個查詢?

表結構

listings - ls_id,ls_cat_id,ls_title 
listings_categories - lc_id,lc_parent,lc_name 
+2

請張貼您的模式 – Ankur

+0

或者您可以創建一個sqlfiddle嗎? – caitriona

+0

另外,如何「深」的子類別去?它只是1級? – caitriona

回答

1

好吧,我提出了一些假設在這裏,這可能會或可能不會是真實的,並取決於你的架構和數據,但這樣的事情應該工作:

select numListings, lc_name from 
(
    SELECT 
    IF(lc_parent = 0, lc_id, lc_parent) AS lc_parent_id, COUNT(ls_id) as numListings 
    FROM listings_categories 
    LEFT JOIN listings ON listings.ls_cat_id = listings_categories.lc_id 
    group by lc_parent_id 
) catList 
inner join listings_categories on catList.lc_parent_id = listings_categories.lc_id; 

此假定:

  • 如果一個類別沒有父,則lc_parent列的值是0
  • 只有2個級別的類別 - 即。父母&孩子,沒有孫子
  • 你只是想顯示父類別的結果

讓我知道如果這些假設是不正確的,我可以調整查詢。

1

我剛找到正確的答案。

SELECT category.lc_name AS name, 

COUNT(listings.ls_cat_id) + (

    SELECT COUNT(listings.ls_cat_id) FROM listings_categories AS subcategory 
    LEFT JOIN listings ON listings.ls_cat_id = subcategory.lc_id 
    WHERE category.lc_id = subcategory.lc_parent 
) AS count 

FROM listings_categories AS category 
LEFT JOIN listings ON listings.ls_cat_id = category.lc_id 
GROUP BY category.lc_id ORDER BY name ASC 

我只是說當前計數到另一個select語句,當前的類別ID,以新的select語句的父類ID相匹配。

"name" "count" 
"auto detailing" "0" 
"auto insurance" "1" 
"auto mechanic" "1" 
"auto painting" "0" 
"auto sales and parts" "0" 
"automotive" "3" 
"business" "0" 
"dental clinics" "0" 
"fashion" "0" 
"health and medicine" "0" 
"health insurance" "0" 
"home and garden" "0" 
"hospital" "0" 
"jobs and employment" "0"