簡體   English   中英

MySQL計數范圍內的結果以及任何范圍內的第一次出現

[英]MySQL Counting Results Within a Range and First Occurance In Any Range

尋找有關實現此目標的最佳方法的建議。 我已經嘗試過一些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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM