2010-03-13 9 views
0

Je souhaite répertorier les messages ayant reçu un utilisateur spécifique d'un autre groupe d'utilisateurs par ID et classés par le dernier message reçu.Commande MySql par problème

Si j'utilise cette requête:

SELECT MAX(id), fromid, toid, message 
    FROM pro_messages 
WHERE toid=00003 
GROUP BY fromid 

Je ne suis pas dernier message envoyé par l'utilisateur « fromid » à l'utilisateur « Toid », mais le premier message envoyé. Puis-je le faire d'une autre manière ou je dois le faire avec deux requêtes ou joindre des tables?

id - ID de message fromid - id utilisateur qui a envoyé un message Toid - id de l'utilisateur qui reçoit un message (dans ce cas l'utilisateur 00003)

+0

OP déjà posté cette question et ne donne pas d'informations suffisantes. http://stackoverflow.com/questions/2436342/mysql-query-problem-with-order-by/2436370#2436370 –

+0

@Sergio S'il vous plaît modifier votre question originale et fournir des informations que les gens ont demandé. –

+0

ok. Je pensais que je ne pouvais pas y répondre parce que ma question n'est pas bien expliquée. – Sergio

Répondre

1

D'abord, vous aurez envie de faire attention à votre valeur toid Là. Le remplissage par zéro peut causer des problèmes s'il est interprété comme un nombre octal: 00010 est 9 décimal, et toid=9 n'est probablement pas ce que vous avez l'intention. En ce qui concerne vos problèmes de messages, vous obtenez un comportement normal pour l'opérateur GROUP dans MySQL. Considérons le tableau simplifié suivant:

mysql> select * from messages; 
+------+--------+------+---------+ 
| id | fromid | toid | message | 
+------+--------+------+---------+ 
| 1 | 100 | 3 | hi  | 
| 2 | 100 | 3 | there | 
| 3 | 100 | 3 | how  | 
| 4 | 101 | 3 | did  | 
| 5 | 100 | 3 | are you | <--the message you want, right? 
+------+--------+------+---------+ 

Lorsque vous regroupez sur fromid, la base de données fractionne toutes les lignes correspondant aux conditions de regroupement en une seule rangée. Dans ce cas, votre requête obtenir les résultats suivants

mysql> select max(id), fromid, toid, message from messages where toid=3 group by fromid; 
+---------+--------+------+---------+ 
| max(id) | fromid | toid | message | 
+---------+--------+------+---------+ 
|  5 | 100 | 3 | hi  | 
|  4 | 101 | 3 | did  | 
+---------+--------+------+---------+ 

Remarquez maintenant la « 100 » ligne a max (id) de 5, mais le message id = 1. C'est ainsi que fonctionnent les opérations GROUP BY. Vous ne pouvez pas contourner cela avec une simple requête, mais si vous passez à un sous-sélection comme suit, vous obtiendrez les résultats appropriés:

mysql> select id, fromid, toid, message from messages where id in (select max(id) from messages where toid=3 group by fromid); 
+------+--------+------+---------+ 
| id | fromid | toid | message | 
+------+--------+------+---------+ 
| 4 | 101 | 3 | did  | 
| 5 | 100 | 3 | are you | 
+------+--------+------+---------+