2012-12-11 43 views
0

在MySQL中,我想對錶table1table2進行外部連接。MySQL的外部連接以COUNTS爲基礎,日期爲

我想通過code今天和昨天才分組的相關table2計數,但我也希望能夠看到其他code類型的0。這計數是我到目前爲止

SELECT h.code, count(h.code) as count, h.timestamp 
FROM table1 h LEFT OUTER JOIN table2 o ON h.code= o.code 
GROUP BY h.code 

UNION 

SELECT h.code, count(h.code) as count, h.timestamp 
FROM table1 h RIGHT OUTER JOIN table2 o ON h.code= o.code 
GROUP BY h.code 

所以我想申請這樣的事情

WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1 

但也包括在表1的以0

計數的所有記錄

我希望這是有道理的,希望有人能幫助!

+0

首先,你確定你想使用'UNION'而不是'UNION ALL',它不會刪除重複項?另外,爲什麼不使用單個查詢,按天分組,每隔2天? – Kermit

+0

@njk你是對的,但你會需要其中一個查詢是一個反聯盟,如果你做聯盟所有 –

+0

感謝您的意見。問題是可能存在現有的代碼,但過去2天沒有代碼。所以我不能簡單地查詢最近2天。但是在過去的兩天內也可能會有結果,所以我無法在之前和之後加入。我怎麼能申請一個反連接? – neolaser

回答

0

嗯,你有一個表的所有代碼?

select codes.code, coalesce(t.cnt) as cnt 
from (select distinct code 
     from table1 
    ) codes left outer join 
    (select code, count(*) as cnt 
     from table1 
     where timestamp >= CURRENT_DATE - INTERVAL 1 
     group by code 
    ) t 
    on codes.code = t.code 

該查詢比需要更復雜一點,因爲它確實需要查詢的第一部分代碼表。下面是一個也許更簡單的形式,如果你只有一個表:

select code, 
     sum(case when timestamp >= CURRENT_DATE - INTERVAL 1 then 1 else 0 end) as cnt 
from table1 
group by code 
+0

感謝您的回答。沒有代碼表,因爲這個想法是要動態地添加代碼。我嘗試了一些類似'case when'的情況,但是在指定日期之前和之後可能會有結果 – neolaser

0

所以我想申請這樣的事情

WHERE h.timestamp> = CURRENT_DATE - 時間間隔1

但還包括table1中的所有記錄但計數爲0

正如您所寫的,您正在複製結果,其中h.code= o.code。所以它值得在第二個查詢中做WHERE h.code is null。因爲這意味着對於那個查詢,我們不希望應用h的條件,因此我們只需將它添加到第一個查詢中。

SELECT h.code, count(h.code) as count, h.timestamp 
FROM table1 h LEFT OUTER JOIN table2 o ON h.code= o.code 
WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1 
GROUP BY h.code 

UNION ALL 

SELECT h.code, count(h.code) as count, h.timestamp 
FROM table1 h RIGHT OUTER JOIN table2 o ON h.code= o.code 
WHERE h.code is null 
GROUP BY h.code 

如果由於某種原因,你想的日期標準適用於ho但前提是爲o記錄,則第一where子句將

WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1 
     AND 
     (o.timestamp >= CURRENT_DATE - INTERVAL 1 
     or o.code is null) 
+0

它是關於code = NULL的有效點。第一部分仍然存在問題。在table1中可能有CURRENT_DATE之前的日期 - 1,可能不會出現在表2中... – neolaser

+0

是否要將日期標準應用於h和o? –

0
SELECT 
h.code, 
count(case h.code is null then 0 else 1 end) as count, 
h.timestamp 
FROM table1 h LEFT OUTER JOIN table2 o ON h.code= o.code 
WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1 
group by h.code