GROUP BY

Kiri
Invité n'ayant pas de compte PHPfrance

19 août 2006, 05:38

Bonjour,

Ca ne doit pas être très compliqué mais ça fait un moment que j'ai pas touché à mysql et ça me pose problème...

J'ai une table contenant des messages :

idmessage
envoyeur
destinataire
message
lu
dateheure
rep

Les messages sont organisés en discussions, le champ rep contient l'id de la discussion à laquelle le message appartient.

Je voudrais afficher le message le plus récent de chaque discussion auquel a participé un destinataire donné.

J'ai pensé à faire un GROUP BY rep, je peux alors avoir accès au champ dateheure du message le plus récent, via max(dateheure), mais comment avoir accès aux autres champ du même enregistrement ?

Merci d'avance

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

20 août 2006, 00:16

Tu peux soit faire comme tu le dis un GROUP BY sur le champs d'horodatage puis une requête pour récupérer n'importe lequel des enregistrements correspondant à la date et à l'utilisateur (ou le faire dans une seule requête en utilisant une sous-requête) ou encore trier les enregistrements de l'utilisateurs par le champs d'horodatage et récupérer le plus récent. Par exemple:

Code : Tout sélectionner

SELECT * FROM table WHERE destinataire = 123 ORDER BY dateheure DESC LIMIT 1
Un conseil, assure-toi d'avoir un index sur (destinataire, dateheure), il accélerera grandement l'exécution de ta requête dès que tu auras pas mal de messages dans ta base.

Ah, une dernière chose : cette astuce ne peut pas fonctionner pour récupérer les enregistrements de pluseurs utilisateurs à la fois. (c-à-d un enregistrement par utilisateur, pour cela il faudrait faire quelque chose basé sur GROUP BY)

Kiri
Invité n'ayant pas de compte PHPfrance

20 août 2006, 18:08

Merci pour ta réponse, mais je ne comprends pas bien pourquoi tu parles de GROUP BY sur le champ d'horodatage, je voudrais grouper les messages par discussion (= même valeur de champ "rep"), et pour chaque discussion, afficher les infos de son message le plus récent.

En fait j'aurais dû appeler ce champ "rep", plutôt discussion ou topic, ça aurait été plus clair, désolé