表结构如下:
CREATE TABLE `yd_link_record` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `ip` varchar(120) NOT NULL DEFAULT '' COMMENT '访问ip地址',
  `spare_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '其他备用关联ID',
  `link_from` tinyint(2) NOT NULL DEFAULT '0' COMMENT '访问终端1:iPhone,2:Android,3:公众号,4:微信小程序',
  `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '统计时间',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='浏览记录表';此记录表会对每天的来访ip做记录,无论他的ip有没有重复,都会写入这个数据库中。且,会对来访设备进行备注。
现在要求如下:根据时间来筛选(默认当月1号到月尾)这个时间段内每个访问终端的uv总数,每天每个ip只被计算一次。三天时间了,实在想不出来解决方案,请各位帮帮忙……

解决方案 »

  1.   

    怎么知道ip在create_time字段中的数据是不是在那天的24小时出现次数大于1次?
    比如说我一个ip在4月2号的时候访问了10次,但因为这10条数据是在那天的24小时以内的,我的ip查出来的时候就只能是一条,这个sql语句怎么写?
      

  2.   

    好像很简单啊,也就是把访问时间只取年月日,不要时分秒,只按日期来分组就是
    select 
       ip,date(create_time),link_from,count(0) 
    from  yd_link_record where create_time>'2018-05-01' and create_time<'2018-06-01'
       group by ip,date(create_time),link_from
       order by date(create_time) desc;
    就可以统计到每个ip每天访问了多少次。查询出来的结果每个ip每天只有1条的
      

  3.   

    SELECT link_from,count(distinct ip) as counts,FROM_UNIXTIME(create_time,'%Y-%m-%d') as link_day FROM `yd_link_record` WHERE `create_time` BETWEEN 1527782400 AND 1530374399 GROUP BY link_day,link_from
    这样写,好像解决了这个问题,不知道是不是……结果集如下:
    link_from counts link_day
    1 2 2018-06-01
    2 2 2018-06-01
    1 1 2018-06-02