2012-09-06 5 views
0

J'ai une requête MySQL J'ai un problème dans le tri du dernier message de l'expéditeur voici ma requête ci-dessous:requête Mysql tri sur les tables jointes

SELECT 
     `Mes`.`fromid`, 
     `Mes`.`is_read`, 
     `Mes`.`id` AS `mesid`, 
     `Mes`.`message`, 
     max(Mes.date) AS `date`, 
     `User`.`username`, 
     `User`.`MemberID` AS `Uid` 
    FROM `messages` AS `Mes` 
    INNER JOIN `users` AS `User` ON User.MemberID = Mes.fromid 
    WHERE (Mes.toid = 5 AND Mes.fromid <> 5) 
    GROUP BY `Mes`.`fromid` 
    ORDER BY `date` DESC 

ici est ma table de la base de données: tableau des utilisateurs

MemberID  UserName  Email    Password 
1    User1  [email protected] 123456 
2    User2  [email protected] 123456 
3    User3  [email protected] 123456 
4    User4  [email protected] 123456 
5    User5  [email protected] 123456 

Messages tableau:

id  fromid  toid message   is_read date 
1  5   2  hello test 1 1   2012-08-24 01:00:00 
2  2   5  hello test 2 1   2012-08-24 02:00:00 
3  3   5  hello test 3 1   2012-08-24 03:00:00 
4  4   5  hello test 4 1   2012-08-24 04:00:00 
5  2   5  hello test 5 1   2012-08-25 05:00:00 

et ouput de ma requête:

SELECT 
    `Mes`.`fromid`, 
    `Mes`.`is_read`, 
    `Mes`.`id` AS `mesid`, 
    `Mes`.`message`, 
    max(Mes.date) AS `date`, 
    `User`.`username`, 
    `User`.`MemberID` AS `Uid` 
FROM `messages` AS `Mes` 
INNER JOIN `users` AS `User` ON User.MemberID = Mes.fromid 
WHERE (Mes.toid = 5 AND Mes.fromid <> 5) 
GROUP BY `Mes`.`fromid` 
ORDER BY `date` DESC 

est:

USERNAME  MESSAGE   DATE 
user2  hello test 2  2012-08-25 05:00:00 
user4  hello test 4  2012-08-25 04:00:00 
user4  hello test 3  2012-08-25 03:00:00 

Si vous avez remarqué Tri de la date est bonne, mais le dernier message est pas juste. Je veux ma sortie comme ça.

USERNAME  MESSAGE   DATE 
user2  hello test 5  2012-08-25 05:00:00 
user4  hello test 4  2012-08-25 04:00:00 
user4  hello test 3  2012-08-25 03:00:00 

au lieu du message "bonjour test 2" Je veux trier le dernier message qui est "test bonjour 5"

Tout le monde peut aider mon problème?

Merci beaucoup ...

+0

vous pourriez vouloir considérer ces mots de passe dans hachant la table des utilisateurs – hdgarrood

Répondre

1

Il devrait être comme ça,

SELECT *        // -- select the columns you want 
FROM Messages a 
      INNER JOIN 
      (
       SELECT fromid, toid, MAX(`date`) maxDATE 
       FROM Messages 
       GROUP BY fromid, toid 
      ) b ON a.fromID = b.fromID AND 
        a.toid = b.toid AND 
        a.`date` = b.maxDATE 
      INNER JOIN users c 
       ON c.MemberID = a.fromID 
WHERE a.toid = 5 AND a.fromid <> 5 
ORDER BY `date` DESC 
+0

Merci John .. Votre grand! Je voudrais savoir si Comment je peux faire cette requête sur le framework zend ... – devrez

+1

@RezFlorendo: '$ stmt = $ zendDbInstance-> requête ($ query); $ results = $ stmt-> fetchAll(); 'où' $ query' est la requête ... que John vous a donnée. – tuespetre