2009-03-11 11 views
1

J'aurais dû faire plus attention dans les classes de bases de données relationnelles, j'ai donc besoin d'aide.Sélectionnez le plus récent enregistrement correspondant à session_id

J'ai une table structuré comme si (il y a plus, mais je signale que des informations pertinentes):

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

Je veux sélectionner le champ file du dossier avec le plus grand access_time pour chaque session_id. Donc à peu près la dernière page visitée dans chaque session.

J'ai essayé d'innombrables combinaisons de DISTINCT et de la clause GROUP BY, mais je n'arrive pas à m'en faire une idée pour quelque raison que ce soit. J'utilise MySQL. Aidez-moi, s'il vous plaît.

Répondre

1

Je sais que cela fonctionnera dans SQL Server, et il devrait porter sur 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

Cela ne le fait que pour un session_id; il a demandé pour chacun. – MarkusQ

+0

Était en cours d'édition .... – cjk

+0

Cela a fonctionné! (avec un peu de peaufinage). Voici la requête que j'ai utilisée: sélectionnez t1.session_id, t1.access_time, t1.file de la table AS t1 join (sélectionnez session_id, max (access_time) en tant que access_time du groupe de tables par session_id) comme t2 sur t1.session_id = t2.session_id et 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

Cela va ramener les fichiers où l'heure de la session correspond à une heure de session pour une autre session – cjk

+0

@ck Non, il ne le fera pas. Lisez-le plus attentivement. Il renvoie uniquement les lignes où access_time est égal à l'accès_time le plus récent POUR CETTE SESSION. C'est à ça que sert la clause where. – MarkusQ

+0

Oui bien sûr, vous avez raison. C'est normalement comme ça que je le ferais, j'avais juste un bloc mental. – 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 

S'il y a des valeurs en double access_time pour la même session_id alors vous pourriez obtenir plusieurs lignes pour que id_session. Vous pouvez modifier cela pour éviter cela si nécessaire en fonction de vos règles métier pour cette situation.

Questions connexes