MySQL - SUM加入表列

时间:2013-03-08 15:07:47

标签: mysql

我正在尝试进行稍微复杂的查询,除了我的一个联接之外,我几乎得到了我所需要的东西。我没有得到预期的数据。

我的尝试

SELECT email.*, email_type.*, email_subtype.*, email_dailytotal.*, SUM(email_dailytotal.fullconversions - (email_dailytotal.duplicates + email_dailytotal.invalids)) as validleads, email_week.*, SUM(adjustment) as total_adjustment, email_costmethod.*
FROM email 
LEFT JOIN email_type on email.type = email_type.type_id
LEFT JOIN email_subtype on email_subtype.type_id = email_type.type_id 
LEFT JOIN email_dailytotal on email_dailytotal.email_id = email.email_id 
LEFT JOIN email_week on email_week.email_id = email.email_id 
LEFT JOIN email_costmethod on email_costmethod.costmethod_id = email.costmethod
WHERE email.email_id = '12163'
AND business IN ("group", "dead") 
AND agency="MFC" 
AND start_date >="2013-02-01" 
GROUP BY email.email_id, email_dailytotal.oeyearno
ORDER BY email.email_id DESC

除了加入email_dailytotalemail时,我几乎得到了我想要的东西:

LEFT JOIN email_dailytotal on email_dailytotal.email_id = email.email_id 

由于我只从email_dailytotal获取其中一行而不是该广告系列的所有行。

我可以使用此基本查询执行此操作:

SELECT SUM(fullconversions) FROM email_dailytotal WHERE email_id = 12163

结果为27,但在我的整体查询中,我得到的第一行恰好是1

email_dailytotal的最小化结构是:

email_id | fullconversions  | summarydate |

因此它包含广告系列每一天的数据:

12163 |  1 | 2013-02-27
12163 | 10 | 2013-02-26
12163 | 15 | 2013-02-25
12163 |  1 | 2013-02-22

所以在我的加入中,我得到的是最后一行而不是求和。

任何人都可以指出它出错的地方吗?

P.S。我为这个问题的混乱道歉,我试图制作一个sqlfiddle但是因为我的构建架构超过8000个字符它不起作用,如果它可以帮助任何人回答,我将它包含在下面。

我通常会显示表格的结构,但我需要花费数小时才能将其格式化为合理的标准。

数据

http://pastebin.com/NV0nAwrp

1 个答案:

答案 0 :(得分:1)

基本问题是您的SELECT子句和GROUP BY子句不一致。

尝试按照以下方式更改它们:

SELECT email.email_id,
  SUM(email_dailytotal.fullconversions - (email_dailytotal.duplicates + email_dailytotal.invalids)) as validleads, 
  SUM(adjustment) as total_adjustment
...
GROUP BY email.email_id

我还建议使用ONLY_FULL_GROUP_BY sql_mode,这样MySQL就不会让你执行这样的查询。