2014-08-27 82 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