2011-12-25 117 views
2

寻找一些关于完成此操作的最佳方式的建议。我已经尝试过几个堆栈溢出问题的联盟,连接和别名示例 - 没有人似乎让我想要去我的地方没有错。我想我一直在寻找解决这个错误的方式。MySQL在任何范围内的第一次占用范围内计数结果

我有一个表记录我们用户的所有活动。每个日志都包含一个带有ID的列,另一个带有一个TIMESTAMP。没有列说明事件类型是什么。

我想要做的是抓住一个范围内的计数,并附加一个虚拟列与激活日期(第一次访问),无论它是否在范围内。对此的商业案例是我希望有报告显示活动范围内的用户,活动日期以及活动范围内的活动数量。

这样做的HTML输出应该是这样的: 用户/在范围/初诊总访问次数(范围与否)/最近我如何已经得到访问(范围)

这一步是这样:

$result = mysql_query(" 
SELECT user, MIN(timestamp), MAX(timestamp), count(user) 
AS tagCount FROM " . $table . " 
WHERE date(timestamp) BETWEEN '" . $startdate . "' AND '" . $enddate . "' 
GROUP BY user 
ORDER BY " . $orderby . " " . $order) or die(mysql_error()); 

我然后循环:

$i = 1; 
while($row = mysql_fetch_array($result)){ 
    $user_name = str_replace("www.", "", $row['user']); // removing www from usernames 
     if($i % 2 != 0) // used for alternating row colors 
      $iclass = "row"; 
     else 
      $iclass = "row-bg"; 
     echo "<div class=\"" . $iclass . "\"><div class=\"number\">" . $i . "</div><div class=\"number\">" . $row['tagCount'] . "</div><div class=\"name\">" . "<a href=\"http://" . $row['user'] . "\" target=\"_blank\">" . $server_name . "</a>" . "</div>" . "<div class=\"first\">" . $row['MIN(timestamp)'] . "</div><div class=\"recent\">" . $row['MAX(timestamp)'] . "</div></div>";  
        $i++; 
     } 

的MIN(时间戳)在上面抓住范围内第一时间标记 - 我想GRA b第一个时间戳,不管范围。

我该怎么做?

回答

1

关键是创建一个虚拟派生表,该派生表分别计算它们的第一个访问权限,然后通过查询返回指定时间段内的记录并加入到该表中。

以下是SQL Server代码,但我认为它也适用于mysql。如果没有,让我知道,我会编辑语法。不管怎样,这个概念都很健康。

为样本

if object_id('tempdb..#eventlog') is not null 
    drop table #eventlog 


create table #eventlog 
(
    userid int , 
    eventtimestamp datetime 
) 

insert #eventlog 
select 1,'2011-02-15' 
UNION 
select 1,'2011-02-16' 
UNION 
select 1,'2011-02-17' 
UNION 
select 2,'2011-04-18' 
UNION 
select 2,'2011-04-20' 
UNION 
select 2,'2011-04-21' 

declare @StartDate datetime 
declare @EndDate datetime 

set @StartDate = '02-16-2011' 
set @EndDate = '05-16-2011' 

这里只安装代码的,将解决你的问题的代码,你可以用你的表名

select e.userid, 
     min(eventtimestamp)as FirstVisitInRange, 
     max(eventtimestamp) as MostRecentVisitInRange, 
     min(e2.FirstAccess) as FirstAccessEver, 
     count(e.userid) as EventCountInRange 
from #eventlog e 
     inner join 
      (select userid,min(eventtimestamp) as FirstAccess 
        from #eventlog 
       group by userid 
      ) e2 on e.userid = e2.userid 
    where 
      e.eventtimestamp between @StartDate and @EndDate 
    group by e.userid 
+0

TetonSig更换#eventlog,我肯定得到生成一个临时表的概念,但是由于多个用户可能同时访问数据而离开了这个概念,我必须以某种方式将其与用户配置文件或会话绑定。无论如何不添加表格来做到这一点? – user1115569 2011-12-25 20:56:50

+0

临时表仅用于此处的示例,用于演示一些示例数据。你可以用你现有的表执行此操作,只需将#eventlog替换为你的表名即可。 – TetonSig 2011-12-25 21:01:11

+0

TetonSig,我只是把它带回到实验室,并能够创建到底需要什么。我仍在努力理解你所提出的语法,但是这使我的学习时速达到了每小时几千英里。谢谢! – user1115569 2011-12-25 23:35:29