2010-08-03 127 views
1

是必要的選擇值某些日期,如何做到這一點,我知道之間選擇的所有數據,但不工作來解決一個問題。兩個日期

我在MySQL表:

[User]. [Wins]. [DATE] 
# 
Ivan ....... 4 ..... 05/06/2010 
# 
Ivan ....... 3 ..... 06/15/2010 
# 
Ivan ........ 6 ..... 06/18/2010 
# 
Ivan ........ 1 ..... 29/06/2010 

的問題是,如果用戶沒有訪問過該網站,則不會創建在數據庫中的一行,並錯過了獲得的日期。

如何獲得統計(如勝0)如06/06/2010至2010年6月14日的期間?幫助做出這個查詢。

+0

你想在一個時間來查詢單的日期範圍,或產生與日期範圍內桶的直方圖?你的問題意味着單一的日期範圍,但我懷疑你想要一個更一般的解決方案。 – 2010-08-03 03:30:29

回答

0

嘗試'勝利'字段上的'總和'聚合函數,並限制它(使用where)到特定日期範圍(所以日期< ='6/14/2010'和日期> ='06/06/2010' )。

因此,像 SELECT SUM(勝)FROM [tbl_name],其中[日期]之間[日期1]和[日期2]

獲得在每個日期範圍勝場數;請按[用戶]添加'group',以查看每個用戶在該日期範圍內獲得的勝數。

0

這裏有一個答案我懷疑會做的伎倆。我創建一個臨時表給你一個日期列表(我使用一個循環開始和結束日期插入日期。計數器必須從0開始,因爲你想包括開始日期本身)。

然後,我就加入了DateList到WINS表給你範圍內的所有日期,用戶和他們對這些日期的訪問列表。我還沒有測試過,但我懷疑代碼已經接近正是你所需要的。

DECLARE Counter INT DEFAULT 0 
DECLARE NumDays INT DEFAULT DATEDIFF(StartDate, EndDate) 

CREATE TEMPORARY TABLE DateList 
(
    [Date] DATETIME 
) 

WHILE Counter <= NumDays 
    INSERT INTO DateList ([Date]) VALUES (DATE_ADD(StartDate, INTERVAL Counter Day)) 
    SET Counter = Counter + 1 
END WHILE 

SELECT 
    [User] 
    ,COUNT(User) AS Wins 
    ,DateList.[Date] AS [Date] 
FROM 
    DateList LEFT JOIN Wins ON Wins.[Date] = DateList.[Date] 
WHERE 
    DateList.[Date] BETWEEN StartDate AND EndDate 
GROUP BY 
    [User] 
    ,DateList.[Date] 
ORDER BY 
    DateList.[Date] 

編輯:我做了一些改變,我的連接和我的數量。我已經測試了MSSQL版本,它工作正常。

3

MySQL沒有遞歸功能,讓你留下了使用數字表絕招 -

  1. 創建一個只持有遞增的數字表 - 易使用AUTO_INCREMENT做:

    DROP TABLE IF EXISTS `example`.`numbers`; 
    CREATE TABLE `example`.`numbers` (
        `id` int(10) unsigned NOT NULL auto_increment, 
        PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    
  2. 使用填充表:

    INSERT INTO NUMBERS 
        (id) 
    VALUES 
        (NULL) 
    

    ...的儘可能多的價值,你需要。

  3. 使用DATE_ADD構建日期列表的基礎上,NUMBERS.id值增加的日子:

    SELECT x.* 
        FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY), '%m/%d/%Y') 
          FROM numbers n 
         WHERE DATE_ADD('2010-06-06', INTERVAL n.id -1 DAY) <= '2010-06-14) x 
    
  4. LEFT JOIN到您的基於時間部分的數據表:

    SELECT x.ts AS timestamp, 
          COALESCE(COUNT(y.wins), 0) AS cnt 
        FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY), '%m/%d/%Y') AS ts 
          FROM numbers n 
          WHERE DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY) <= '2010-06-14') x 
    LEFT JOIN TABLE y ON STR_TO_DATE(y.date, '%m/%d/%Y') = x.ts 
    GROUP BY x.ts 
    
+0

+1。很好的答案。 – 2010-08-03 04:25:26