2009-12-10 42 views

回答

4

你需要創建一個幫助臺,並與來自start所有日期與該表往裏面end,那麼就LEFT JOIN

SELECT d.dt AS date, 
     COUNT(*) AS total, 
     SUM(attitude = 'positive') AS positive, 
     SUM(attitude = 'neutral') AS neutral, 
     SUM(attitude = 'negative') AS negative 
FROM dates d 
LEFT JOIN 
     messages m 
ON  m.posted_at >= d.dt 
     AND m.posted_at < d.dt + INTERVAL 1 DAYS 
     AND spam = 0 
     AND duplicate = 0 
     AND ignore = 0 
GROUP BY 
     d.dt 
ORDER BY 
     d.dt 

基本上,你所需要的就是一個虛擬的行源。

MySQL是唯一缺乏生成方法的主要系統。

PostgreSQL實現特殊功能generate_series要做到這一點,而OracleSQL Server可以使用遞歸(CONNECT BY和遞歸CTE S,相應地)。

+0

OMG。沒有辦法巧妙地做到這一點?也許存儲過程,或者什麼? – Arywista 2009-12-10 00:27:40

+0

您可以使用存儲過程來填充表格(這隻需要執行一次)。 – Quassnoi 2009-12-10 00:28:13

+0

好的 - 但我總是有不同的開始日期。所以我爲每個可能的日期創建表? :-( – Arywista 2009-12-10 00:37:22

0

我不知道MySQL是否會支持以下/類似的語法;但如果沒有,那麼你可以創建並刪除臨時表。

--Inputs 
declare @FromDate datetime, /*Inclusive*/ 
     @ToDate datetime /*Inclusive*/ 
set @FromDate = '20091101' 
set @ToDate = '20091130' 

--Query 
declare @Dates table (
    DateValue datetime NOT NULL 
) 
set NOCOUNT ON 
while @FromDate <= @ToDate /*Inclusive*/ 
begin 
    insert into @Dates(DateValue) values(@FromDate) 
    set @FromDate = @FromDate + 1 
end 
set NOCOUNT OFF 

select dates.DateValue, 
     Col1... 
from @Dates dates 
     left outer join SourceTableOrView data on 
      data.DateValue >= dates.DateValue 
     and data.DateValue < dates.DateValue + 1 /*NB: Exclusive*/ 
where ...?