2011-09-08 3 views
0

J'essaie de retourner le dernier message basé sur l'horodatage d'un groupe d'expéditeurs.PHP Comment retourner les dernières entrées par groupe d'utilisateurs?

Le tableau de base et qry ressemble à ceci

SELECT senderName, messages 
FROM MessageTable 
WHERE receiverID = 1 

(output) 
Joe "Hey" 
Bob "Yo" 
Jim "Blah" 
Joe "What's up" 

Je veux obtenir le dernier message de chaque expéditeur. J'ai pensé utiliser ORDER BY et LIMIT mais cela renvoie juste 1 message de l'ensemble de qry. Ce qui n'est pas le résultat que je cherche.

SELECT senderName, messages 
FROM MessageTable 
WHERE receiverID = 1 
ORDER BY sentDate ASC LIMIT 1 

(output) 
Bob "Yo" 

Je voudrais avoir ce genre de sortie, où seul le dernier message de Joe est retourné avec le dernier message de l'autre expéditeur. J'ai examiné une autre question sur stackoverflow, mais cela n'avait aucun sens pour moi. https://stackoverflow.com/questions/384142/how-to-get-latest-record-for-each-day-when-there-are-multiple-entries-per-day

Merci beaucoup!

+0

groupe par senderName –

Répondre

0

GROUP BY est votre ami http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

Vous pourriez faire quelque chose comme ceci:

SELECT senderName, messages 
FROM MessageTable 
GROUP BY senderName 
ORDER BY sentDate DESC 
+0

J'ai toujours traité cette utilisation de 'GROUP BY' comme non fiable, c'est que je n'ai trouvé aucune documentation pour son utilisation (en utilisant des champs qui ne sont pas listés dans la clause GROUP BY et non encapsulés dans une fonction agrégée). J'ai pensé que c'était une bizarrerie de MySQL sur laquelle on ne pouvait pas compter (la plupart des autres SGBDR rejetteraient cette déclaration, je crois). –

+0

@liamgriffiths Cela arrive! Il renvoie maintenant le message de chaque expéditeur mais pas le dernier de Joe. Il revient le plus tôt Joe. J'ai essayé ASC et cela a juste changé l'ordre dans lequel le retour entier a été trié. – Newphper

0

Ok, après quelques recherches et de tâtonnements, cette requête a retourné ce que je cherchais:

SELECT a.senderName, a.messages, a.sentDate 
FROM MessageTable AS a, 
(
    SELECT senderName, MAX(sentDate) as max_date 
    FROM MessageTable 
    WHERE ReceiverID = 1 
    GROUP BY senderName 
) AS b 
WHERE a.senderName = b.senderName 
AND a.sentDate = b.max_date; 

Tout le crédit va à ce site: http://forums.devarticles.com/general-sql-development-47/select-max-datetime-problem-10210.html

0

Le type de requêtes est appelé "requêtes de classement" et nécessite généralement un certain niveau de compétence. Voici une question similaire: Retrieving the last record in each group

Il est préférable que vous opériez avec des identifiants numériques au lieu de chaînes pour rendre la requête assez efficace.

Questions connexes