2013-08-22 53 views
0

我想用良好的性能方法構建SQL查詢。我需要選擇與此類別相關的所有類別和計數頻段。MySQL - 多重連接關係和計數行

結構:

波段:

id  | band_name  |cat_id 
----------|----------------|------------ 
1  | Business 1  | 1 
2  | Business 12 | 2 
3  | Business 123 | 2 

類:

id  | name   
----------|---------------- 
1  | Business 1  
2  | Business 12  
3  | Business 123 

連接:

id  | band_id  |cat_id 
----------|----------------|------------ 
1  | 1    | 1 
2  | 2    | 1 
3  | 2    | 1 

查詢:

SELECT c.name AS category_name, (SELECT COUNT(icc.band_id) FROM cms_bands_categories_connections AS icc RIGHT JOIN cms_bands AS ib ON icc.band_id = ib.id) AS bands_sum FROM 
        cms_bands_categories AS c 
       JOIN cms_bands_categories_connections AS cc ON 
        c.id = cc.category_id 
       GROUP BY 
        c.id 

結果非常奇怪 - bands_sum在每行中顯示爲3。不要責怪我的結構 - 我不得不因爲需求規格的改變而被稱爲modyfi。

+0

請通過添加適當的標籤(Oracle,SQL Server,MySQL等)來指定您要定位的RDBMS。可能會有利用不被普遍支持的語言或產品功能的答案。此外,通過使用特定的RDBMS標記它,您的問題可能會得到更適合回答的人的關注。 – Taryn

回答

1

爲什麼使用子查詢而不是聚合?

SELECT c.name AS category_name, COUNT(cc.band_id) AS bands_sum 
FROM cms_bands_categories c JOIN 
    cms_bands_categories_connections cc 
    ON c.id = cc.category_id 
GROUP BY c.id; 

你甚至不需要bands表來計算它們。該信息位於連接表中。

+0

我現在看到。有用。 –