[ORACLE] problème avec "select in select" ou équivalent

problème avec "select in select" ou équivalent [ORACLE] - SQL/NoSQL - Programmation

Marsh Posté le 20-12-2013 à 07:54:58    

Bonjour à tous (ca fait un bail que j'ai pas posté ici :D )
 
J'ai un problème avec Oracle...
 
Exemple:
Deux tables
 
table_utilisateurs
 
numero_d_utilisateur
nom
prenom
adresse
 
table messages:
 
numero_message
utilisateur
message_content
date_message
 
Comment faire pour avoir le dernier message de TOUS les utilisateurs?
 
SELECT numero_d_utilisateur, nom, prenom, adresse,
 ( SELECT date_message FROM  table messages WHERE rownum = 1 ORDER BY date_message DESC )
FROM table_utilisateurs
 
Ca marche pas. :/
 
J'avoue que je sèche.
 
Merci!
 
 


---------------
Expert en expertises
Reply

Marsh Posté le 20-12-2013 à 07:54:58   

Reply

Marsh Posté le 20-12-2013 à 21:07:36    

Je dirais:

SELECT tu.numero_d_utilisateur, tu.nom, tu.prenom, tu.adresse, tm.message_content
FROM table_utilisateurs tu
JOIN (SELECT utilisateur, MAX(date_message) AS date_dernier_message FROM table_messages GROUP BY utilisateur) dm
       ON dm.utilisateur = tu.utilisateur_id
JOIN table_messages tm ON tm.utilisateur = dm.utilisateur AND tm.date_message = dm.date_dernier_message

Remplaces JOIN par LEFT JOIN si tu veux avoir les gusses sans messages dans ton resultat.
 
Si tu as suffisament de donnees pour avoir des problemes de perf, un index sur table_messages(utilisateur, date_message) ne sera pas de trop (ou un truc dans le genre).
L'autre option etant d'ajouter un champ table_utilisateurs(num_dernier_message) et le maintenir histoire de pouvoir faire une jointure directe du meilleur gout.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 16-01-2014 à 09:52:56    

select * from  table_utilisateur as a inner join table_msg as b            
on a.id_user = b.id_user                              
where (a.id_user, b.date_msg) in (                    
SELECT a.id_user,                                    
max(date_msg) FROM table_utilisateur as a inner join table_msg as b on a.id_user = b.id_user  group by a.id_user)      
---- union si tu veux avoir les utilisateurs sans message--------
union                                                
(select * from  table_utilisateur as a exception join table_msg as b    
on a.id_user = b.id_user)          
order by 1
 
C'est un peu tordu.. mais ça marche bien :)                                


Message édité par gpl73 le 16-01-2014 à 09:53:50
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed