有必要为某些日期选择值,我知道怎么做,但有一个问题无法解决。
MySQL中的表:
[User]. [Wins]. [DATE]
#
Ivan ....... 4 ..... 05/06/2010
#
Ivan ....... 3 ..... 06/15/2010
#
Ivan ........ 6 ..... 06/18/2010
#
Ivan ........ 1 ..... 29/06/2010
问题是如果用户没有访问过该站点,则不会创建数据库中的一行并错过所获得的日期。
如何获取统计数据(例如Wins 0),例如2010年6月6日至2010年6月6日期间?帮助进行此查询。
答案 0 :(得分:3)
MySQL没有递归功能,因此您只需使用NUMBERS表技巧 -
创建一个只保存递增数字的表 - 使用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;
使用以下方法填充表格:
INSERT INTO NUMBERS
(id)
VALUES
(NULL)
...根据需要提供尽可能多的价值。
使用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
根据时间部分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
答案 1 :(得分:0)
在'wins'字段上尝试'sum'聚合函数并将其限制(使用where)到该特定日期范围(因此日期&lt; ='6/14/2010'和日期&gt; ='06/06/2010 “)。
等等 在[date1]和[date2]之间选择SUM(获胜)FROM [tbl_name] WHERE [DATE]
获取每个日期范围内的获胜次数;添加“按[用户]分组”,以查看每个用户在该日期范围内的获胜次数。
答案 2 :(得分: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版本,它工作正常。