[英]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.