2010-07-28 21 views
3

我有2個表:MySQL的權限使用組參加由問題

  1. LandingPages - 包含每個廣告系列着陸頁。

  2. 報告 - 包含命中和每個着陸頁轉換。

我試圖做的查詢帶來點擊和每個着陸頁轉換的總和,

但我想,如果登陸頁面沒有收到任何點擊和轉換(並沒有表現出報告表)然後我希望返回0作爲結果。

我做什麼,到現在爲止是:

SELECT l.LandingPageId, SUM(Hits) AS Hits, SUM(PixelSum) AS Conversion 
FROM Report c 
RIGHT JOIN LandingPages l ON(c.LandingPageId = l.LandingPageId) 
WHERE c.CampaignId = x 
AND DayDate > 'y' 
GROUP BY c.LandingPageId 

的問題是,我只得到與着陸頁中存在的報告表,並通過日期「Y」行,

(如:我只得到2行着陸頁的,但有4着陸頁

如果我運行此查詢我得到4個結果

SELECT l.LandingPageId FROM LandingPages l WHERE l.CampaignId = x 

不是所有着陸頁(0值),

我怎樣才能得到這個工作,像我想,你也給我的着陸頁,並非報告表或表,但在舊日期?

謝謝。

更新:

我幫了很多關於你的答案,我得到的工作對我來說只是如果不是在報告表中所有存在的着陸頁部分解決方案,但如果它是存在的,但日期條款不與之匹敵不會出現:

的部分解決方案查詢:

SELECT l.LandingPageId, IFNULL(SUM(Hits),0) AS Hits, IFNULL(SUM(PixelSum),0) AS Conversion 
    FROM LandingPages l 
    LEFT JOIN Report c ON(l.LandingPageId = c.LandingPageId) 
    WHERE (l.CampaignId = x OR l.CampaignId IS NULL) 
    AND (DayDate > 'y' OR DayDate IS NULL) 
    GROUP BY l.LandingPageId 

我還需要你的幫助!

謝謝!

+0

您可以顯示某個廣告系列的兩個表格的內容嗎?如果你不做GROUP BY,你會得到多少行?你應該得到4.請記住,你做出了總和。 – hol 2010-07-28 13:36:27

+0

報告表包含數千次活動線的,因爲,我不把這個 – 2010-07-28 13:52:08

+0

如果於爾根Hollfelder表的創建是正確的,你可以請打印出你所期望的結果表提供什麼呢?謝謝。 – Frankie 2010-08-06 04:12:01

回答

1

我把thomas的想法, 和幾乎沒有改進它的工作!

查詢:

Select L.LandingPageId 
    , Coalesce(Sum(R.Hits), 0) As Hits 
    , Coalesce(Sum(R.PixelSum), 0) As Conversion 
From LandingPages As L 
    Left Join Report As R 
     On R.LandingPageId = L.LandingPageId 
      And L.CampaignId = X 
      And R.DayDate > 'y' 
WHERE L.CampaignId = X 
Group By L.LandingPageId 
3

好的。當我運行以下時,我從下面得到結果。那是你要的嗎?

drop table landingpages; 
create table landingpages (campaignid number, landingpageid number, daydate number); 

insert into landingpages values (1,100,20); 
insert into landingpages values (1,101,21); 
insert into landingpages values (2,102,20); 
insert into landingpages values (2,103,21); 

drop table report; 
create table report (campaignid number, landingpageid number, hits number, pixelsum number); 

insert into report values (1,100, 2, 1); 
insert into report values (2,102, 20, 21); 
insert into report values (2,103, 30, 31); 

commit; 

SELECT c.LandingPageId, SUM(Hits) AS Hits, SUM(PixelSum) AS Conversion 
    FROM landingpages c 
    LEFT JOIN report l ON(c.LandingPageId = l.LandingPageId) 
    WHERE c.CampaignId = 1 
    AND DayDate > 19 
    GROUP BY c.LandingPageId 


LANDINGPAGEID  HITS CONVERSION 
------------- ---------- ---------- 
      100   2   1 
      101      


2 rows selected. 

我希望這是你所需要的。我在Oracle上運行了上述內容,但在mySQL中應該沒有實際差別,因爲這是所有標準查詢語言。

+0

@haim evgi - 他接近,你需要從LandingPages FIRST既然你想從該表中的所有記錄來選擇,然後離開,以便從該表中獲取匹配的記錄加入報告中。 – JNK 2010-07-28 13:16:38

+1

你可以添加一個參考樣也看到http://www.w3schools.com/sql/sql_join.asp的連接類型的簡短說明?這是不值得一個完整的答案:) – extraneon 2010-07-28 13:16:50

+0

同意。鏈接會很好。我想添加一個。我只有鏈接到德國網站。所以感謝您的幫助。 – hol 2010-07-28 13:25:17

1

它是RIGHT JOIN的B/c。重新運行它:

SELECT l.LandingPageId, SUM(Hits) AS Hits, SUM(PixelSum) AS Conversion 
FROM LandingPages l 
LEFT JOIN Reports c ON(c.LandingPageId = l.LandingPageId) 
WHERE c.CampaignId = x 
AND DayDate > 'y' 
GROUP BY c.LandingPageId 
+0

我嘗試,但沒有工作,對不起 – 2010-07-28 13:17:33

+0

你得到什麼結果呢? – JNK 2010-07-28 13:18:13

+0

我只得到2行着陸頁的,但有4着陸頁 – 2010-07-28 13:20:21

1

你有這樣的:WHERE c.CampaignId = x這意味着,如果登陸頁面沒有收到任何點擊和轉化(在報告表中未顯示),登陸頁面將永遠不會在結果中顯示,儘管你使用正確的加入。您的c.CampaignId對於這些着陸頁將爲空,並且c.CampaignId = x將爲false。

嘗試:

SELECT l.LandingPageId, SUM(Hits) AS Hits, SUM(PixelSum) AS Conversion 
FROM Report c 
RIGHT JOIN LandingPages l ON(c.LandingPageId = l.LandingPageId) 
WHERE (c.CampaignId = x or c.CampaignId is null) 
AND DayDate > 'y' 
GROUP BY l.LandingPageId 

我也按l.LandingPageId因爲目標網頁的報道,c.LandingPageId爲空。

0

的一些問題,我看到了

  • 請在所有情況下前綴的列(即l.fieldname,c.fieldname),所以我可以告訴你從哪個表中獲得它們。無論如何,我在下面爲您製作了一些示例代碼,但我不能確定它是100%的,因爲我並不總是知道表格,這對於右連接非常重要,所以您可能需要對其進行調整。
  • 當您在右連接表上設置標準(WHERE c.CampaignID = something)時,您將它轉換爲INNER JOIN。如果你想避免這種情況,那麼添加「...或者c.CampaignID爲空)因爲RIGHT連接的想法是IF有一個campaignID,你希望它是'x',但是如果沒有競選活動,這是確定了。(是嗎?)

你不能概括空,所以我說COALESCE改變零點零。

SELECT 
    l.LandingPageId, 
    SUM(COALESCE(Hits,0)) AS Hits, 
    SUM(PixelSum) AS Conversion 
FROM 
     Report c 
    RIGHT JOIN 
     LandingPages l 
    ON 
     (c.LandingPageId = l.LandingPageId) 
WHERE c.CampaignId = x OR c.CampaignID is null 
AND DayDate > 'y' 
GROUP BY c.LandingPageId 
2

首先,你沒有告訴我們,這表Hits,PixelSumDayDate存儲在?表示這個事實在我的查詢顯然,?將需要替換爲t他適當的別名。但是,假設您在日期標準不匹配的情況下稍後提到了問題,我認爲DayDate來自報表。

總之,您需要在左連接的ON子句中應用該條件。 ON條款標準在之前被應用,它被連接到LandingPages表。因此,除了DayDate值< ='y'(順便說一下,DayDateDayDate > 'y'的數據類型是什麼數據類型,我看來)之前,報表將被加入到LandingPages表中之前,Campaigns <> X將被過濾掉。

另外,您應該考慮使用Coalesce而不是IsNull,因爲Coalesce是ISO標準。

Select L.LandingPageId 
    , Coalesce(Sum(?.Hits), 0) As Hits 
    , Coalesce(Sum(?.PixelSum), 0) As Conversion 
From LandingPages As L 
    Left Join Report As R 
     On R.LandingPageId = L.LandingPageId 
      And R.CampaignId = X 
      And (R.DayDate > 'y' Or R.DayDate Is Null) 
Group By L.LandingPageId 

For more information on Left Joins, here is a visual representation