[REQUETE SQL] Probleme lors de tri dans une requête
Résolu
patrice86
Messages postés
1380
Date d'inscription
Statut
Membre
Dernière intervention
-
patrice86 Messages postés 1380 Date d'inscription Statut Membre Dernière intervention -
patrice86 Messages postés 1380 Date d'inscription Statut Membre Dernière intervention -
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 :)
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 :)
A voir également:
- [REQUETE SQL] Probleme lors de tri dans une requête
- Comment faire un tri personnalisé sur excel - Guide
- Logiciel tri photo - Guide
- Peut on récupérer un colis au centre de tri chronopost - Forum Consommation & Internet
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de tennis mais pas de tennis de table ✓ - Forum Android
- Logiciel sql - Télécharger - Bases de données
2 réponses
Bonjour,
Quelle que chose comme ceci te donnera, pour chaque personne, sa dernière humeur enregistrée.
Et si tu veux un id_users spécifique, tu rajoutes, bien sûr,
Xavier
PS : « Or », pas « Hors » ! ;-)
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 » ! ;-)
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 ! ;)
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 ! ;)
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
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