2011-12-25 79 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