php - MySQL统计某个范围内的结果和任意范围内的首次出现

标签 php mysql select join union

寻找有关实现此目标的最佳方法的一些建议。我尝试了几个 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(timestamp) 抓取范围内的第一个时间戳 - 我想抓取第一个时间戳而不考虑范围。

我该怎么做?

最佳答案

关键是创建一个虚拟派生表,单独计算他们的第一次访问,然后从返回您指定时间段内的记录的查询连接到它。

下面是 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

关于php - MySQL统计某个范围内的结果和任意范围内的首次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631367/

相关文章:

php - Docker:如何在多个容器/服务之间共享相同的应用程序代码(例如PHP-FPM和NGINX)

MYSQL 截断不正确的 DOUBLE 值

mysql - Doctrine inversedBy 字段包含 PersistentCollection

MySQL平均: Making Statement More Efficient

php - 带图片的博客文章?

javascript - 使用php存储提交信息并在单独的html页面上显示

javascript - 无需重新加载页面的数组中的 PHP 随机值

mysql获取具有限制的多个列的平均值

java - 将 "select foo from Foo foo, Bar bar where ..."形式的HQL查询转换为Criteria查询

c# - 动态 Linq select 语句