2009-07-30 6 views
3

J'ai actuellement les tableaux ci-dessous pour un forum de messagerie privée:MySQL Select Déclaration - Pour les messages

alt text http://img159.imageshack.us/img159/45/pmdata.jpg

alt text http://img504.yfrog.com/img504/3968/pminfo.jpg

Ce que je suis en train de faire est sortie une « boîte de réception » qui affiche le thread le plus récent en haut et groupe par thread (ce qui signifie, vous ne voyez pas le même thread deux fois dans votre boîte de réception), peu importe qui est l'expéditeur.

Ce que j'ai en ce moment fonctionne bien pour les messages simples entre 2 heures. Cependant, une fois qu'un troisième utilisateur répond au même thread, il ne s'affiche pas correctement. Ma requête en cours est la suivante:

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent 
FROM pm_info 
INNER JOIN pm_data ON pm_info.message_id = pm_data.id 
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID 
INNER JOIN (SELECT thread_id, sender_id, MAX(date_sent) AS thread_max_date_sent FROM pm_data GROUP BY thread_id, sender_id) deriv1 ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent AND pm_data.sender_id = deriv1.sender_id 
WHERE pm_info.receiver_id = '$usrID' 
ORDER BY deriv1.thread_max_date_sent DESC 

En supposant que $ usrid = 68 (donc, receiver_id = 68), il affiche ceci:

From: Kyle (pm_data.id = 18) RE: single message (thread_id= 13587) 
From: Ed (pm_data.id = 12) RE: single message (thread_id= 13587) 
From: Ed (pm_data.id = 8) RE: Test Number 2 (thread_id= 16256) 

Remarquez comment la thread_id (13587) montre deux fois parce qu'il sont 2 expéditeurs différents.

Comment est-ce que je peux l'avoir juste afficher le plus récent thread_id, peu importe qui est l'expéditeur?

Merci beaucoup !!

Répondre

0

Il semble en fait que la requête dans la question d'origine ne nécessite qu'une très petite modification pour obtenir l'enregistrement le plus récent pour chaque thread.

  1. baisse du sender_id dans le groupe de la sous-requête de champs
  2. tomber le pm_data.sender_id = deriv1.sender_id dans la clause ON
 
SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent 
FROM pm_info 
INNER JOIN pm_data ON pm_info.message_id = pm_data.id 
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID 
INNER JOIN (SELECT thread_id, /*sender_id,*/ MAX(date_sent) AS thread_max_date_sent 
       FROM pm_data GROUP BY thread_id /*, sender_id*/) deriv1 
    ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent /*AND pm_data.sender_id = deriv1.sender_id*/ 
WHERE pm_info.receiver_id = '$usrID' 
ORDER BY deriv1.thread_max_date_sent DESC 

Comme une note de côté: si possible, chercher le max messageID dans cette sous-requête au lieu de max (date_sent)

1

Essayez

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid 
FROM pm_data, pm_info, tblUsers as sender 
WHERE pm_info.message_id = pm_data.id 
    AND pm_data.sender_id = sender.usrID 
    AND pm_info.receiver_id = '$usrID' 
GROUP BY thread_id 
ORDER BY date_sent DESC 
LIMIT 0,1 
0

Essayez

SELECT pm_info.is_read, group_concat(DISTINCT sender.usrFirst) as sender_name, 
    pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid, 
    MAX(date_sent) AS thread_max_date_sent 
FROM pm_info 
INNER JOIN pm_data ON pm_info.message_id = pm_data.id 
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID 
WHERE pm_info.receiver_id = '$usrID' 
GROUP BY pm_data.thread_id 
ORDER BY thread_max_date_sent DESC; 

Ne hésitez pas à être en désaccord avec la partie group_concat, si elle ne répond pas à vos besoins; il liste juste tous les expéditeurs pertinents au lieu d'en choisir un arbitrairement.

0

Ma suggestion serait de scinder votre base de données en deux tableaux pour mieux normalisation: "thread" et "message". Il y a des informations de thread qui seraient communes à tous les messages, comme le titre du thread. Vous gaspillez de l'espace dans la table des messages en répétant les mêmes valeurs.

Vous pouvez avoir un champ "dernière heure de publication" dans la table des fils, qui est mise à jour à chaque nouvelle publication. Ensuite, il suffit de sélectionner dans la table des fils et de commander par le dernier message. Ce sera aussi beaucoup plus rapide.