2012-04-10 72 views
0

我有一個查詢返回一些數據的罪狀,但我不希望有一個null值的數據...MySQL的 - 衝突的WHERE和GROUP BY語句

舉個例子,代碼滾動統計從點擊系統到表格。

SELECT sh.dropid, 
COUNT(DISTINCT IF(sh2.`SentDate` IS NOT NULL, sh2.`subid`, NULL)) AS sentCount, 
COUNT(DISTINCT IF(sh2.`Open` = 1, sh2.`subid`, NULL)) AS openCount, 
COUNT(DISTINCT IF(sh2.`Click` = 1, sh2.`subhistid`, NULL)) AS clickCount, 
COUNT(DISTINCT IF(sh2.`Bounced` = 1, sh2.`subid`, NULL)) AS bounceCount, 
COUNT(DISTINCT IF(sh2.`Unsubscribed` = 1, sh2.`subid`, NULL)) AS unsubCount, 
COUNT(DISTINCT IF(sh2.`Abuse` = 1, sh2.`subid`, NULL)) AS abuseCount 
FROM subscriberhistory sh 
INNER JOIN subscriberhistory sh2 ON sh.subid = sh2.subid 
WHERE sh.SentDate >= '#runDate# #lastRunTime#' 
AND sh.dropid IS NOT NULL 
AND sh.dropid != "" 
OR (sh.SentDate IS NULL AND sh.OpenDate >= '#runDate# #lastRunTime#') 
OR (sh.SentDate IS NULL AND sh.ClickDate >= '#runDate# #lastRunTime#') 
OR (sh.SentDate IS NULL AND sh.UnsubscribeDate >= '#runDate# #lastRunTime#') 
OR (sh.SentDate IS NULL AND sh.BouncedDate >= '#runDate# #lastRunTime#') 
OR (sh.SentDate IS NULL AND sh.AbuseDate >= '#runDate# #lastRunTime#') 
GROUP BY dropid 
ORDER BY sentCount DESC 

編輯:更正查詢

SELECT sh.dropid, 
COUNT(DISTINCT IF(sh2.`SentDate` IS NOT NULL, sh2.`subid`, NULL)) AS sentCount, 
COUNT(DISTINCT IF(sh2.`Open` = 1, sh2.`subid`, NULL)) AS openCount, 
COUNT(DISTINCT IF(sh2.`Click` = 1, sh2.`subid`, NULL)) AS clickCount, 
COUNT(DISTINCT IF(sh2.`Bounced` = 1, sh2.`subid`, NULL)) AS bounceCount, 
COUNT(DISTINCT IF(sh2.`Unsubscribed` = 1, sh2.`subid`, NULL)) AS unsubCount, 
COUNT(DISTINCT IF(sh2.`Abuse` = 1, sh2.`subid`, NULL)) AS abuseCount 
FROM subscriberhistory sh 
INNER JOIN subscriberhistory sh2 ON sh.subid = sh2.subid 
WHERE sh.dropid IS NOT NULL AND sh.dropid != "" 
AND ((sh.SentDate >= '2012-04-10 14:15') 
OR (sh.SentDate IS NULL AND sh.OpenDate >= '2012-04-10 14:15') 
OR (sh.SentDate IS NULL AND sh.ClickDate >= '2012-04-10 14:15') 
OR (sh.SentDate IS NULL AND sh.UnsubscribeDate >= '2012-04-10 14:15') 
OR (sh.SentDate IS NULL AND sh.BouncedDate >= '2012-04-10 14:15') 
OR (sh.SentDate IS NULL AND sh.AbuseDate >= '2012-04-10 14:15')) 
GROUP BY sh.dropid 
ORDER BY sentCount DESC 

返回是這樣的記錄集的例子...

(dropid) sent opens clicks 
400  2 3  4 
401  2 3  6 
NULL  2 3  4 

同樣,我們的目標是保持NULL數據出來以前的記錄集。有人可以向我解釋爲什麼這種行爲正在發生以及如何解決它。

+0

自我內連接的目的是什麼?既然你在兩個實例中加入同一列,它將不會執行任何操作。你還沒有在查詢的其他地方引用'sh2'。 – 2012-04-10 23:31:57

+0

好的,在你的輸出中提到的字段標題 – Starx 2012-04-10 23:32:35

+0

它用於計數。如果我理解正確,MySQL可以建立一個表格,對它進行操作,並在比實際表格操作更短的時間內返回記錄集。一定要告訴我,如果我錯了......我也認爲這個連接可能導致了空記錄的返回,但我在同一張表上進行了分組和過濾,所以我對此表示懷疑。 – TaylorPLM 2012-04-10 23:34:22

回答

1

正如我的評論所述 - NULL行正在通過WHERE聲明中的OR條件蔓延。

考慮:

WHERE sh.dropid IS NOT NULL 
AND sh.dropid != "" 
OR (some.other.condition) 

假設你有一排sh.dropid爲NULL,但仍然滿足some.other.condition - 那麼整個WHERE條款將評估爲TRUE因爲OR的。

解決方案 - 添加括號。例如(取決於你之後的邏輯):

WHERE sh.dropid IS NOT NULL 
    AND sh.dropid != "" 
    AND ( one.condition 
     OR second.condition 
     OR third.condition 
     )