Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/05/2011, 20h18   #1
Invité de passage
 
Inscription : mai 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 2
Points : 0
Points : 0
Par défaut Sélection d'un item d'un group by

Bonjour bonjour !

J'ai ce petit problème lors de la requête des participants à une discussion, dont je voudrais aussi avoir la date du dernier message et son contenu. Ceci se base sur une seule table, messages, contenant notamment les champs id_user, content, datetime.
Je simplifie autant que possible (en prenant soin de ne rien enlever d'important), mais voici ma requête :

Code :
1
2
3
4
5
6
7
8
SELECT
  id_user,
  MAX(datetime) AS datetime,
  content ???
FROM messages
GROUP BY id_user
ORDER BY datetime DESC');
Vous l'aurez compris, mon problème consiste à extirper le contenu du dernier message de chaque auteur. Le GROUP BY fait que seul la première valeur est sélectionnée, donc le message le plus ancien (la table étant bien entendu ordonnée ainsi). J'ai songé à diverses possibilités, comme faire un GROUP_CONCAT(content) ORDER BY datetime DESC en mettant précédemment group_concat_max_len à 1... mais c'est un petit trick qui peut sûrement être évité. J'aimerai aussi éviter les solutions à base de requêtes imbriquées, que je pense pénalisante pour la rapidité.

Voilà, je bloque, et votre avis serait grandement apprécié !

Merci d'avance
Gagee
Gagee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 12h59   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Je pense que tu dois pouvoir t'inspirer de cette source.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 13h25   #3
Invité de passage
 
Inscription : mai 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 2
Points : 0
Points : 0
Merci de ton aide, Maljuna Kris. En effet cette source apporte une solution, mais qui utilise des requêtes imbriquées. Peut-être n'y a-t-il pas moyen de faire autrement, d'autant plus que j'avais mal compris le sens de group_concat_max_len, qui est le nombre de caractères et non d'entrées concaténées.
Gagee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 13h35   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par Gagee Voir le message
En effet cette source apporte une solution, mais qui utilise des requêtes imbriquées. Peut-être n'y a-t-il pas moyen de faire autrement
Normalement, la requête imbriquée et corrélée doit puvoir être remplacée par une jointure.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 15h05   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 003
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 003
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Avec ta requête, Gagee, tu as la date du dernier message de chaque utilisateur. Pour récupérer les infos de ce dernier message, il faut faire une jointure de la table message avec la requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT m.id_message, m.id_user, m.`datetime` AS date_message
FROM messages m
INNER JOIN
(
    SELECT id_user,
    MAX(datetime) AS derniere_date
    FROM messages
    GROUP BY id_user
) tmp ON tmp.id_user = m.id_user
    AND tmp.derniere_date = m.`datetime`
ORDER BY m.`datetime` DESC
Une remarque au passage :
DATETIME est un type de colonne MySQL, ta colonne ne devrait pas s'appeler ainsi. C'est pour ça que j'ai mis son nom entre apostrophes inversées.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h26.


 
 
 
 
Partenaires

Hébergement Web