[REQUETE SQL] Probleme lors de tri dans une requête

Résolu/Fermé
patrice86 Messages postés 1378 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 - Modifié par patrice86 le 3/04/2014 à 17:06
patrice86 Messages postés 1378 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 - 9 avril 2014 à 11:16
Bonjour,

J'espère que je vais être suffisamment clair pour expliquer mon problème.

Je suis dans une table 'etre' dans laquelle il y a plusieurs enregistrements.
Je souhaite récupérer le id_humeur en indiquant l'id_users MAIS en prenant la date la plus haute pour l'id_users indiqué !

Pas simple à comprendre n'est-ce pas ?
Alors voici une image de ma BDD et de ma requête

http://hpics.li/22ab865

Comme vous pouvez le voir dans la requête, je veux tout sélectionner en indiquant comme id_users le 1 MAIS je veux récupérer l'id_humeur correspondant à cette id_users en récupérant la datetime la plus élevée !

Hors, j'ai comme retour de cette requête, l'id_humeur 3 correspondant à l'id_users 5 car la datetime est bien la plus élevée DANS la table à savoir 2014-04-03 17:02:36

En gros, la requête ne veut pas effectuer le max(datetime) sur l'id_users indiqué. Elle l'effectue sur toute la table sans prendre en compte mon indication.

Hors là en l'occurrence je veux comme réponse l'id_humeur 3 qui correspond à mon id_users 1 car la datetime la plus élevé de cet utilisateurs est 2014-04-03 16:48:24


Une idée de la solution ? Car là, je colles.

Google est ton ami :)

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 4/04/2014 à 11:10
Bonjour,

Quelle que chose comme ceci te donnera, pour chaque personne, sa dernière humeur enregistrée.
select etre.id_humeur, etre.id_users, humeur.* from etre
inner join (
    select max(datetime) as max_date, id_users from etre group by id_users
) dt on dt.id_users = etre.id_users AND dt.max_date = etre.datetime
inner join humeur on humeur.id_humeur = etre.id_humeur

Et si tu veux un id_users spécifique, tu rajoutes, bien sûr,
WHERE id_users=
à la fin :
select etre.id_humeur, etre.id_users, humeur.* from etre
inner join (
    select max(datetime) as max_date, id_users from etre group by id_users
) dt on dt.id_users = etre.id_users AND dt.max_date = etre.datetime
inner join humeur on humeur.id_humeur = etre.id_humeur
where etre.id_users = 1


Xavier

PS : « Or », pas « Hors » ! ;-)
0
patrice86 Messages postés 1378 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 125
5 avril 2014 à 14:31
Hmm cela semble parfaitement bien fonctionner !

Pour dormir moins c** ce soir, peux-tu expliquer rapidement ta requête stp ?

Je ne comprend pas bien l'histoire du Inner Join là doublement utilisé.

Merci Xavier ! ;)
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
7 avril 2014 à 13:24
En fait, je fais une première jointure vers une sous-table qui contient, pour chaque personne, la date de son dernier changement d'humeur.
Cela permet de ne sélectionner que ces lignes-là.

La deuxième jointure est celle que tu avais toi-même dans ta requête, vers la table Humeur, pour récupérer le nom de l'humeur (j'imagine).

Faire
FROM t INNER JOIN j on t.jid = j.id
revient à faire ce que tu as fait toi :
FROM t, j WHERE t.jid = j.id

Je préfère personnellement l'écriture INNER JOIN, car elle permet de mieux cerner les erreurs éventuelles (produits cartésiens indésirables) et me semble plus lisible en séparant de la clause WHERE les contraintes réelles sur les données, de celles qui relèvent de la structure des données. Et elle permet quelques nuances comme les LEFT OUTER JOIN.

Xavier
0
patrice86 Messages postés 1378 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 125
9 avril 2014 à 11:16
Bien.
Merci beaucoup Xavier ;)
0