Mysql 如何按天数选择访客计数

Mysql 如何按天数选择访客计数,mysql,sql,date,Mysql,Sql,Date,我有这个表,我需要从中选择按日期计算的访客数 CREATE TABLE `visitors` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `ip` VARCHAR(32) NOT NULL, `browser` VARCHAR(500) NOT NULL, `version` VARCHAR(500) NOT NULL, `platform` ENUM('w','l','m') NOT NULL, `date`

我有这个表,我需要从中选择按日期计算的访客数

CREATE TABLE `visitors` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ip` VARCHAR(32) NOT NULL,
  `browser` VARCHAR(500) NOT NULL,
  `version` VARCHAR(500) NOT NULL,
  `platform` ENUM('w','l','m') NOT NULL,
  `date` DATE NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `person` (`ip`,`date`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
我试试这个:

SELECT DATE(`date`) AS `date`, COUNT(*) AS `visitor`
FROM `visitors` WHERE (`date` >= (NOW() - INTERVAL 7 DAY))
GROUP BY `date`;
date         visitor
2015-12-19    2
2015-12-22    5
date         visitor
2015-12-17    0        // Make 0 for the day which is not present
2015-12-17    0        // Make 0 for the day which is not present
2015-12-18    0        // Make 0 for the day which is not present
2015-12-19    2
2015-12-20    0        // Make 0 for the day which is not present
2015-12-21    0        // Make 0 for the day which is not present
2015-12-22    5
它返回以下内容:

SELECT DATE(`date`) AS `date`, COUNT(*) AS `visitor`
FROM `visitors` WHERE (`date` >= (NOW() - INTERVAL 7 DAY))
GROUP BY `date`;
date         visitor
2015-12-19    2
2015-12-22    5
date         visitor
2015-12-17    0        // Make 0 for the day which is not present
2015-12-17    0        // Make 0 for the day which is not present
2015-12-18    0        // Make 0 for the day which is not present
2015-12-19    2
2015-12-20    0        // Make 0 for the day which is not present
2015-12-21    0        // Make 0 for the day which is not present
2015-12-22    5
但我真正想要的是:

SELECT DATE(`date`) AS `date`, COUNT(*) AS `visitor`
FROM `visitors` WHERE (`date` >= (NOW() - INTERVAL 7 DAY))
GROUP BY `date`;
date         visitor
2015-12-19    2
2015-12-22    5
date         visitor
2015-12-17    0        // Make 0 for the day which is not present
2015-12-17    0        // Make 0 for the day which is not present
2015-12-18    0        // Make 0 for the day which is not present
2015-12-19    2
2015-12-20    0        // Make 0 for the day which is not present
2015-12-21    0        // Make 0 for the day which is not present
2015-12-22    5

如果我尝试使用工会,并以此获得日期,那么示例1周就没有问题。但是如果我需要1年,我能做什么呢?

使用序列引擎。因此,您可以在不使用表的情况下生成日期

这将在没有其他发动机的情况下工作。您只需要有一个包含更多记录的表作为天数。倒数天数是限制

SELECT compare_date , count(v.`date`)
FROM (
    SELECT DATE(now() - INTERVAL @nr:=@nr+1 DAY)  AS compare_date 
    FROM information_schema.COLUMNS, (SELECT @nr:=-1) AS tmp 
    LIMIT 7
    ) AS d
LEFT JOIN  `visitors` v ON v.`date` = compare_date
GROUP BY compare_date;

请告诉我这对您很有用。

听起来您需要一个日历表。我认为创建一个带有日期的表不是一个好主意。。。它需要大量的内存。。。如果表中没有显示,我需要0。。。这是唯一的问题。@maiabardavelidze sql无法发明不存在的内容,所以您需要某种帮助表。请参阅我上面链接的重复主题。@Maiabardavelize包含所有必要日期的表格是一件令人沮丧的小事。@草莓您甚至不需要日历表格,只需要一个包含数字1到7的表格,正如链接主题所述。它不适用于meI。我不明白如何在我的案例中使用日期添加。有人能帮我吗???我想这可能会有帮助…@maia bardavelidze-我在我的答案中添加了另一个问题。请测试它。是的,它正在工作。最后一个问题。我怎么能在一个月或一年的时间里这样做呢?例如,如果我需要年份信息,我必须获得1月份的最后一个月计数,如果我需要所有信息,我必须获得年份访问计数。。。我该怎么做?