2011-10-28 15 views
2

我試圖將幾個SQL調用壓縮成一個,並想知道如果以下是可能的。SQL調用返回天數與多日項目的月份

這裏是我的表格。

Organization 
    id 

Event 
    id, 
    startDate 
    endDate 

FavoriteOrgs 
    userId 
    orgId 

對於一個月中的每一天,我想回到那一天發生的事件的計數。不要太難,直到您添加事實事件可以跨度2或3天

以下是迄今爲止我能夠準確地顯示日事件次數的內容,但它僅包含事件的計數,以便它開始的那一天。

SELECT DAYOFMONTH(CAST(o.start_date AS DATE)) AS dayNum, COUNT(*) AS count 
    FROM favoriteOrgs f, event e, organization o 
    WHERE f.user_id =200372 
    AND e.profile_id = o.id AND e.profile_id = f.profile_id AND o.id = f.profile_id 
    AND e.last_date >= '$startDate' 
    AND e.start_date <= '$lastDate' 
    GROUP BY e.start_date 
+0

你可以發佈你的模式嗎 – hafichuk

+0

我發佈了它的問題,但這裏又是:organization(id); event(id,startDate,endDate); favoriteOrgs(userId,orgId) –

+0

那不是一個模式。我不知道那是什麼。在您的mysql客戶端運行「DESC組織」等。請參閱http://dev.mysql.com/doc/refman/5.0/en/describe.html。 – hafichuk

回答

3

您的數據模型實際上並未建模系統中的所有實體。一個實體是您有興趣報告事物的日期。

您應該爲您的數據庫添加一個表(或者使用臨時表,內聯表或其他任何可用於MySQL的表)。表格只是所有相關日期。即使是一張可以追溯到1900年並且前進到2100年的桌子也會相當小。

查詢則變得微不足道:

CREATE TABLE Calendar (
    calendar_date DATE NOT NULL, 
    CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED 
) 

SELECT 
    C.calendar_date, 
    COUNT(*) AS count 
FROM 
    favoriteOrgs F 
INNER JOIN Event E ON 
    E.profile_id = F.profile_id AND 
    E.last_date >= '$startDate' AND 
    E.start_date <= '$lastDate' 
INNER JOIN Organization O ON 
    O.id = F.profile_id AND 
    O.id = E.profile_id 
WHERE 
    F.user_id = 200372 
GROUP BY 
    C.calendar_date 

你現在也有一個優點,即可以添加其他業務的具體信息,以日曆日期,就像一個「is_holiday」一欄,「economic_quarter」或什麼的。只要記住預填充表格,這是一個簡單的循環,你必須運行一次。

+0

哇。優秀的回覆,謝謝。原諒我在這裏的經驗不足,但目前'機會'表的'startDate'和'endDate'列是時間戳 - 機會有開始和結束時間以及日期。有沒有辦法利用這個解決方案和時間戳? –

+0

如果您只希望它在一天之內崩潰,那麼我認爲代碼沒有任何區別。我是一個MS SQL人員,他們有一個棘手的TIMESTAMP數據類型,所以我不知道MySQL如何處理它。如果你想讓它按小時或某種東西細分,那麼你可以在1到24的一組生成的數字中加入「JOIN」,並根據那些數據與日期一起加入。關鍵是將您的一組桶作爲數據集本身。 –

相關問題