Mysql 获取左联接和分组依据的不正确和

Mysql 获取左联接和分组依据的不正确和,mysql,group-by,left-join,Mysql,Group By,Left Join,我在存款总额上得到了错误的结果。 我想输出每个活动名称的存款总额报告 最终在一个日期范围内 SELECT IFNULL(campaign_name,'DIRECT'), IFNULL(TotalDeposit,0) FROM trackings LEFT JOIN (SELECT deposit_amount, sum(deposit_amount) AS TotalDeposit, uuid FROM conversions

我在存款总额上得到了错误的结果。 我想输出每个活动名称的存款总额报告 最终在一个日期范围内

 SELECT IFNULL(campaign_name,'DIRECT'),
       IFNULL(TotalDeposit,0)
FROM trackings
LEFT JOIN
  (SELECT deposit_amount,
          sum(deposit_amount) AS TotalDeposit,
          uuid
   FROM conversions
   LEFT JOIN transactions ON conversions.trader_id = transactions.trader_id
   WHERE aff_id =3
     AND TYPE='deposit'
   GROUP BY transactions.trader_id) AS conversions ON trackings.uuid = conversions.uuid
WHERE aff_id=3
GROUP BY campaign_name
结果:trynow活动缺少200个

campaign_name,TotalDeposit
DIRECT,0.00
new_campaign_name,0.00
test march,500.00
testing,0.00
trynow,800.00
预期成果:

campaign_name,TotalDeposit    
DIRECT,0.00
new_campaign_name,0.00
test march,500.00
testing,0.00
trynow,1000.00

我认为您的数据不太正确-使用您提供的数据,测试三月的500押金永远不会退还,因为它与trader_id 7506关联,trader_id 7506在转换表中没有任何记录

但是,下面的查询更简单、更容易理解,并且正确地为trynow返回1000

SELECT
      IFNULL(SUM(t.deposit_amount),0) AS total_deposits
    , IFNULL(tr.campaign_name,'DIRECT') AS campaign


FROM
    trackings tr            LEFT JOIN

    conversions c ON
        tr.uuid = c.uuid    LEFT JOIN

    transactions t ON
        c.trader_id = t.trader_id AND
        tr.`aff_id` = t.aff_id AND
        t.type = 'Deposit' 

WHERE
    tr.aff_id = 3  AND
    tr.updated_at >= '2015-03-01' AND tr.updated_at < '2015-04-01'

GROUP BY
    IFNULL(tr.campaign_name,'DIRECT')
如果您可以检查提供的测试数据或以其他方式为我指出正确的方向,我可能能够改进查询以准确返回您想要的内容


有关日期筛选,请参阅上面添加到where子句的内容。请注意,如果您需要在transactions表中的某个日期上进行筛选,则date filtering子句必须是on语句的一部分,因为该表是左连接的,因此我们不能在main where子句中进行筛选。

将示例数据填充到SqlFIDLE中可能会有所帮助,以便人们可以使用它。我知道我通常能够更好地了解查看数据时发生了什么,而不仅仅是查看查询!如果没有示例数据,您的预期结果将毫无用处。嵌套选择看起来不一致。它仅由一个字段transactions进行分组。trader_id同时在SELECT子句中还有两个字段。此外,如果aff_id=3,double看起来是冗余的。我将示例架构和数据粘贴到这里Simon,谢谢,这返回了正确的结果,此外,我尝试根据您的语法添加附属机构佣金表,但trynow的存款增加了四倍,我如何添加日历表来检查日期范围之间的活动名称总存款?如果您对我的表格结构有任何评论,我将不胜感激,因为我肯定是做错了什么。表格结构就其本身而言似乎相当复杂,但我没有花很长时间试图理解它背后的商业案例。提出理想的结构可能是一个单独的问题,因为我们已经解决了您最初在这里遇到的问题。请参阅我在上面的答案中的其他评论,关于:日期筛选和重复计算问题。如果这个答案有帮助,那么请接受它,以显示一些声誉点爱!在你修改后的查询中,添加distinct使trynow活动的总数从1000降至800。你说得对。我把它拿走了!我必须说一下你对佣金表做了什么,才能进一步发表评论。