2016-12-27 41 views
-1

我有两个表上(daily_book和extra_cost),这样的结构是LEFT JOIN给出不正确的总和结果

daily_book

db_id | refund     
1  | 7161     
2  | 5980     

extra_cost

ec_id | db_id | cost 
1  | 1  | 156 
2  | 1  | 123 
3  | 2  | 100 
4  | 2  | 120 

所以我得到总退款金额和总成本值。

所以我的查询是

$sql = "SELECT SUM(d.refund) AS refund, SUM(e.cost) AS e_cost FROM `daily_book` d LEFT JOIN extra_cost e ON (d.db_id = e.db_id) WHERE d.db_id > 0"; 

我得到的结果是26282退款和499的总成本;这是不正确的。

我想要的结果是13,141退款和499总成本。

+0

你也可能得到一些http://dba.stackexchange.com/宝贵帮助 – zack6849

+0

你应该更加熟悉SQL连接的工作原理然后再继续聚合函数,如'sum()'。如果您从查询中删除了聚合函数调用,则会在JOIN结果中看到重复的行,从而为您提供意外的退款总额。 – faintsignal

回答

1

这里没有神秘感。您正在汇总多行的退款。你需要分别做聚合。在MySQL中,这是有点麻烦,但这里有一个方法:

SELECT dd.refund, SUM(e.cost) AS e_cost 
FROM daily_book d LEFT JOIN 
    extra_cost e 
    ON (d.db_id = e.db_id) CROSS JOIN 
    (SELECT SUM(d.refund) as refund FROM daily_book d WHERE d.db_id > 0) dd 
WHERE d.db_id > 0; 
+0

嘿谢谢先生......现在解决先生......再次感谢 –

+1

如果答案解决了您的问题,请接受答案。 [**如何接受答案**](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)@KrunalJSathavaraKinjal – 1000111