2010-08-03 76 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