2012-10-14 38 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"