2012-02-02 124 views
1

因此,我有兩個表,類別和設計。我想構建一個查詢,它將獲取所有類別以及任何子類別的數量(categories.parent_id等於categories.id)和任何設計的數量(design.category_id等於categories.id)從MySQL中的兩個連接表中獲取多個計數

如果我嘗試獲取這些計數中的一個,一切正常,但是當我嘗試使用以下代碼時,兩者的計數都是相同的數字(而不是正確的數字)。

 $this->db->select('categories.id AS id, categories.parent_id AS parent_id, categories.title AS title, 
     categories.description AS description, categories.img_path AS img_path, COUNT(designs.id) AS design_count, 
     COUNT(sub_categories.id) as sub_category_count'); 
     $this->db->from('categories'); 
     $this->db->join('designs',       'categories.id = designs.category_id', 'left'); 
     $this->db->join('categories as sub_categories',  'categories.id = sub_categories.parent_id', 'left'); 
     $this->db->group_by('categories.id'); 

任何幫助將不勝感激,歡呼!

+0

首先創建SQL查詢並使用PHPMyadmin等工具執行它。只要它在那裏不起作用,它就不能用於任何數據庫抽象(並且你還沒有告訴你正在使用哪一個,它可能是有限的,並且無論如何你都需要執行一個原始的SQL查詢)。 – hakre 2012-02-02 09:28:03

+0

請提供表結構 – 2012-02-02 09:36:37

+0

類別爲: id,parent_id,title。 設計爲: id,category_id,title。 乾杯! – Sam 2012-02-02 09:40:39

回答

3

假設根類不包含設計,這裏是返回必要的信息查詢:

SELECT category.id, category.title, subcategory.id, designs.id 
FROM categories category 
LEFT JOIN categories subcategory ON category.id = subcategory.parent_id 
LEFT JOIN designs ON subcategory.id = designs.category_id 
WHERE category.parent_id IS NULL 

現在,所有你需要做的是應用分組:

SELECT category.id, category.title, COUNT(DISTINCT subcategory.id), COUNT(designs.id) 
FROM categories category 
LEFT JOIN categories subcategory ON category.id = subcategory.parent_id 
LEFT JOIN designs ON subcategory.id = designs.category_id 
WHERE category.parent_id IS NULL 
GROUP BY category.id, category.title 

這裏的關鍵是使用COUNT(DISTINCT ...)

+0

DISTINCT爲我做了 - 謝謝! – Sam 2012-02-02 13:44:41

0
SELECT c.id,c.title, 
     IFNULL(sc.counted,0) AS subcategories, 
     IFNULL(d.counted,0) AS designs 
FROM categories c 
    LEFT JOIN 
    (SELECT parent_id,COUNT(*) AS counted 
     FROM categories GROUP BY parent_id) sc 
     ON c.id=sc.parent_id 
    LEFT JOIN 
    (SELECT category_id,COUNT(*) AS counted 
     FROM designs GROUP BY category_id) d 
     ON c.id=d.category_id 
WHERE c.parent_id IS NULL ; 

應該爲您提供所需的數字作爲原始SQL。