寻找关于实现这一目标的最佳方法的一些建议。我已经尝试了几个Stack Overflow问题中的Unions,Joins和Alias示例 - 似乎没有任何一个让我想到的地方没有他们的错。我想我一直在寻找以错误的方式解决这个问题。
我有一个表记录了用户的所有活动。每个日志包含一个带有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(时间戳)抓住了范围内的第一个时间戳 - 我想抓住第一个时间戳而不考虑范围。
我该怎么做?
答案 0 :(得分: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'
以下是解决问题的代码,您可以将#eventlog替换为您的表名
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