2014-08-27 63 views
2

我对MySQL有一个相当棘手的问题。MySQL组和加入表的总和

我有两个表以一对多关系(下面是相关colums)

表A(活动):

id | channel_type | date 

表B(预算):

id | campaign_id | budget 

我需要单个查询来获取以下结果:

  • 按频道类型计算的广告系列数
  • 与找到的广告系列相关的所有预算总和。

我需要过滤的广告活动表格按列结果(例如在campaigns.date> '2014-05-01')

我曾尝试以下方法:

SELECT channel_type, COUNT(*) cnt, 
    (SELECT SUM(budget) FROM budgets WHERE budgets.campaign_id = campaigns.id)) 
     as budget 
FROM campaigns 
WHERE campaigns.date >= 'some-value' 
    AND [more conditions] 
GROUP BY campaigns.channel_type 

但这当然,由于GROUP我只获得第一个campaign.id结果的channel_type,所以失败了。

任何提示(和解决方案)将非常感激!

TIA

+1

集这件事在[SQL小提琴(http://sqlfiddle.com/),我会帮 – 2014-08-27 16:37:23

+0

如果你仍然有兴趣,我已经把它在小提琴:这里](http://sqlfiddle.com/#!2/a5e42/5) – duffpl 2014-08-27 18:43:52

回答

0

我找到工作的解决方案。 这里的工作查询:

SELECT SUM(budget) as budget, COUNT(*) as count FROM 
    (SELECT * FROM campaigns WHERE [conditions]) AS found_campaigns 
    LEFT JOIN budgets ON budgets.campaign_id = found_campaigns.id 
    GROUP BY channel_type 
0
  1. 获得从预算表使用GROUP BY campain_id总预算。这将是子查询。命名它。例如,A.
  2. 现在使用GROUP BY channel_type和WHERE date> ='some-value'获取来自campains的总计ID计数。
  3. 在最终查询中使用第2步和第1步(子查询将充当表),您将得到结果。 您可以发布架构,然后我可以检查。
0

我认为这应该工作:

SELECT channel_type, COUNT(*) cnt, 
    (SELECT SUM(t2.budget) FROM budgets t2 WHERE t2.campaign_id IN (
    SELECT t3.id FROM campaigns t3 WHERE t3.channel_type = t1.channel_type)) 
    AS budget 
FROM campaigns t1 
WHERE t1.date >= 'some-value' 
    AND [more conditions] 
GROUP BY t1.channel_type 

看到这个fiddle

+0

按预期工作:)我想知道它会有多快。我听说IN和子查询不是很有效。然而,即时消息太不明白,在SQL中确认或提出更好的解决方案。在大型数据集上工作的时候会运行一些基准测试。谢谢 – duffpl 2014-08-27 18:40:47

+0

我分析过你的解决方案,它没有按预期工作。在主查询中,您正在使用馈送给第二个子查询的channel_type来获取活动ID。 Hovewer跳过了WHERE条件。条件计算具有特定日期条件的广告获取其channel_types,然后获取所有找到channel_type的广告系列并将它们提供给SUM(预算)查询。因此,如果我们有10个类型为“1”的广告系列,并且其中有2个广告系列排除了其中的2个,那么计数是正常的(2),但是计算所有(10)个渠道类型为“1”的广告系列的预算。 – duffpl 2014-08-28 09:21:38

+0

为什么不给一个子查询添加日期条件? SELECT t3.id FROM campaigns t3 WHERE t3.channel_type = t1.channel_type AND t3.date> = t1.date – Logar 2014-08-28 09:27:23