2009-03-11 21 views
1

リレーショナルデータベースクラスでもっと注意を払っていたはずですので、何か助けが必要です。最新のレコードを選択するsession_id

私は似た構造のテーブルがそう(もっとありますが、私は唯一の関連情報を掲示しています)があります。

+------------------+-------------+------+-----+-------------------+-------+ 
| Field   | Type  | Null | Key | Default   | Extra | 
+------------------+-------------+------+-----+-------------------+-------+ 
| session_id  | char(32) | NO |  | NULL    |  | 
| file    | varchar(30) | NO |  | NULL    |  | 
| access_time  | timestamp | NO |  | CURRENT_TIMESTAMP |  | 
+------------------+-------------+------+-----+-------------------+-------+` 

私は各session_idの最大のaccess_timeを持つレコードのfileフィールドを選択します。各セッションで最後に訪れたページがかなりわかりました。

私はDISTINCTとGROUP BY句の無数の組み合わせを試しましたが、何らかの理由で私の頭を包んでいるように見えません。私はMySQLを使用しています。助けてください。

答えて

1

これはSQL Serverで動作することがわかっており、MySQLに移植する必要があります。

select session_id, timestamp, file 
from table t1 
join (select session_id, max(timestamp) as timestamp) 
     from table group by session_id) as t2 
    on t1.session_id = t2.session_id 
    and t1.timestamp = t2.timestamp 
+0

これは1つのsession_idに対してのみ行います。彼はそれぞれに尋ねた。 – MarkusQ

+0

編集中でした.... – cjk

+0

それはうまくいきました! (ちょっと微調整して)。ここで私が使用したクエリは次のとおりです。t1.session_id = t2.session_idのt2として、AS t1 joinテーブルからのt1.session_id、t1.access_time、t1.fileの選択(session_id、table_group_session_idによるaccess_timeとしてのsession_id、max(access_time)の選択) t1.access_time = t2.access_time; –

2
select * from my_table t1 
    where t1.access_time = (
     select max(t2.access_time) 
     from my_table t2 
     where t2.session_id = t1.session_id 
     ) 
+0

これは、セッション時間が別のセッションのセッション時間と一致するファイルを戻します。 – cjk

+0

@ckいいえ、それはできません。もっと注意深く読んでください。これは、access_timeがこのセッションの最新のaccess_timeに等しい行だけを返します。これがwhere句の目的です。 – MarkusQ

+0

もちろん、あなたは正しいです。これは通常、私がそれをする方法であり、ちょうど精神的なブロックを持っていた。 – cjk

0
SELECT 
    T1.session_id, 
    T1.file, 
    T1.access_time 
FROM 
    My_Table T1 
LEFT OUTER JOIN My_Table T2 ON 
    T2.session_id = T1.session_id AND 
    T2.access_time > T1.access_time 
WHERE 
    T2.session_id IS NULL 

重複access_time値が同じsession_idのためにそこにいるなら、あなたはそのsession_idのために複数の行を取得する可能性があります。その状況のビジネスルールに応じて必要に応じて回避するために、これを微調整することができます。

関連する問題