2016-12-19 113 views
2

我有兩個表:SUM在LEFT JOIN查詢

Table products 
ID Name   Base  
1  Product_1 5 
2  Product_2 4 

Table orders 
ID Product_ID  
1  1    
2  1   
3  2 

我使用這個查詢:

SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID 

獲得:

ID Base Counter 
1  5  2 
2  4  1 

我現在想做什麼是寫一個查詢返回一個像上面那樣的表格,但帶有額外的列SUM - 基數和計數器之和:

ID Base Counter SUM 
1  5  2   7 
2  4  1   5 

使用單個查詢可以實現這個結果嗎?我還想按SUM列排序我的結果。

+1

如果我們可以假設products.base是數字,然後在GROUP BY後面加上ORDER BY Sum,那麼只需在'As counter'後添加',products.Base + COUNT(orders.ID)作爲Sum'' – xQbert

+0

@xQbert謝謝,這正是我需要的! – bloo79

回答

3

不要過時。只需將它們加上一個加號。

SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter, 
products.Base + COUNT(orders.ID) as `SUM` 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID 
ORDER BY `SUM` 

注:「SUM」是一個聚集SQL函數,所以你就需要圍繞着它的反引號,以便用它作爲列別名名稱。考慮使用不同的名稱。

1
SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter, products.Base + COUNT(orders.ID) as `sum` 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID, products.Base 
ORDER BY `sum` DESC 

始終在group by子句中包含所有非聚合列。請參閱https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

正如您將在該參考資料中看到的那樣,MySQL具有非標準的擴展組,因爲它允許放寬查詢語法。然而,結果依賴於MySQL做出任意選擇來實現分組。此外,如果您遵循SQL語法規則,任何時候ONLY_FULL_GROUP_BY設置都會更改,如果您在group by子句中包含所有非聚合列,則您的查詢將保持有效。

+1

一般我會同意,但作爲products.Id似乎是一個基於訂單和樣本數據連接的主鍵,products.base只能有1個值。所以在這種情況下,mySQL的擴展組真的沒關係。因爲它總是隻有1個值供它選擇。然而,這是假設ID是主鍵。根據你的鏈接,「服務器可以自由選擇每組中的任何值,所以除非它們相同,否則所選的值是不確定的,」如果只有1個值,它必須選擇1,所以它總是正確的。所以在這種情況下不按它分組可能會更快。 – xQbert

+0

即使主鍵,如果設置值被更改,查詢可能會失敗。所以我堅信永遠是這個話題的好建議。 –