2011-12-25 7 views
2

これを達成するための最良の方法についてのアドバイスをお探しください。スタックオーバーフローに関するいくつかの質問から、私はユニオン、ジョイン、エイリアスの例を試しました。誰も私がどこに行きたいのか分からないようです。私はこれを間違った方法で解決しようとしてきたと思う。MySQLの範囲内での結果と任意の範囲内での最初の発生

ユーザーからのすべてのアクティビティを記録するテーブルが1つあります。各ログには、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

+0

テンポラリテーブルはサンプルデータをステージアップするための例です。既存のテーブルでこれを行うことができるのは、テーブル名が何であれ#eventlogを置き換えるだけです。 – TetonSig

+0

TetonSig、私はちょうどこれを研究室に持ち帰り、必要なものを正確に作成することができました。私はまだあなたが前に出されたものの構文を理解するために働いていますが、これは私の学習を1時間に数千マイルも早送りしました。ありがとうございました! – user1115569

関連する問題