2014-01-14 28 views
2

DB結構:建立與加入對使用表中的symfony MySQL查詢

DB Struct

DB描述

北美經銷商之一可以有審查(0,1或更多) review總是有reviews_item 所有reviews_item有一個類別

問題

我需要SQL查詢,使公司的AVG值爲reviews_items.value列表,我需要它通過此值設置順序。即使對於某些「公司」,我也沒有任何「評論」和「reviews_items」公司應該列入AVG == 0. 它應該選擇僅有活動== 1和(如果存在)審覈活躍的公司== 1

我SLQ查詢,不要propertly工作:

SELECT 
    c.name,c.logo,c.url, 
    AVG(ri.value) as avarage 
FROM company c 
LEFT JOIN reviews r ON r.company_id = c.id 
LEFT JOIN reviews_items ri ON ri.review_id = r.id 
LEFT JOIN category cat ON ri.category_id = cat.id 
WHERE c.active = 1 
GROUP BY c.id 

我希望我的問題是明確的:)

PS。對不起,如果我的語言(英文)不太好:D

回答

0

有在WERE clausule缺少某事(OR r.active IS NULL):

SELECT 
    c.name,c.logo,c.url, 
    AVG(NULLIF(ri.value,0)) as avarage 
FROM company c 
LEFT JOIN reviews r ON r.company_id = c.id 
LEFT JOIN reviews_items ri ON ri.review_id = r.id 
LEFT JOIN category cat ON ri.category_id = cat.id 
WHERE c.active = 1 AND (r.active = 1 OR r.active IS NULL) 
GROUP BY c.id 
ORDER BY avarage DESC 

感謝您試用!

+1

是的,我忘了在'NULL'上檢查'r.active'。但我盲目地寫了))沒有測試。祝你好運! – voodoo417

2

首先,由於您沒有選擇,彙總或檢查類別表中的任何內容,因此可以省略JOIN to表類別。

之後,你應該重做你的GROUP BY子句。按照您選擇的所有內容進行分組,這不是beeing聚合:c.name,c.logo,c.url假設它們對於屬於一個id的所有記錄總是相同的。

相反,你也可以聚集領域,如

SELECT 
    MIN(c.name), MIN(c.logo), MIN(c.URL) 
    ... 

,離開GROUP BY原樣。

+0

即時消息使用類別表中的類別名稱,但謝謝:) – unbreak

2

試試這個(不能老是檢查):

SELECT 
    c.name,c.logo,c.url, 
    AVG(NULLIF(ri.value,0)) as avarage 
FROM company c 
LEFT JOIN reviews r ON r.company_id = c.id 
LEFT JOIN reviews_items ri ON ri.review_id = r.id 
LEFT JOIN category cat ON ri.category_id = cat.id 
WHERE c.active = 1 AND r.active = 1 
GROUP BY c.id 
ORDER BY avarage DESC 
+0

這幾乎工作:)我需要選擇所有公司,無論他們有評論,如果有 - 只選擇reviews.active == 1,如果不設置avarage = 0 – unbreak

+0

@unbreak抱歉,不太瞭解你。沒有評論的公司也必須被選中?如果公司沒有評論,它也沒有和reviews_items。 – voodoo417

+0

對不起,如果我寫不明白(?)即時通訊嘗試:)如果公司有審查它有reviews_item,我們選擇所有評論與積極== 1,並計算其價值的AVG,如果公司沒有任何審查,它沒有reviews_item,和我們將該公司的avarge設置爲0。 – unbreak