Frage

Im Moment habe ich die folgenden Tabellen für ein privates Nachricht Forum:

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

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

Was ich versuche einen „Posteingang“ zu tun ausgegeben, die durch Gewinde an der Spitze und die Gruppe des neuesten Thread zeigt (das heißt, Sie haben den gleichen Thread zweimal in Ihrem Posteingang nicht angezeigt), unabhängig davon, wer die Absender ist.

Was habe ich jetzt funktioniert gut für einfache Nachrichten zwischen 2 uesrs. Sobald jedoch ein dritte Benutzer auf den gleichen Thread antwortet, ist es nicht richtig angezeigt. Meine aktuelle Abfrage ist dies:

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

Unter der Annahme, dass $ USRID = 68 (also receiver_id = 68), ist es diese gibt:

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)

Beachten Sie, wie die thread_id (13587) zeigt sich zweimal, weil es zwei verschiedene Sender.

Wie könnte ich es haben nur zeigen die jüngsten thread_id, egal, wer der Absender ist?

Vielen Dank !!

War es hilfreich?

Lösung

Es scheint tatsächlich wie die Abfrage in der ursprünglichen Frage nur eine sehr kleine Änderung erfordert für jeden Thread des tatsächlichen jüngsten Rekord für immer.

  1. Drop die SENDER_ID in der Gruppe der Unterabfrage von Feldern
  2. fallen die pm_data.sender_id = deriv1.sender_id in der ON-Klausel
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

Als Randbemerkung: Wenn möglich, suchen Sie nach dem max messageID in dieser Unterabfrage statt max (date_sent)

Andere Tipps

Versuchen

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

Versuchen

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;

Sie können ferner mit dem Group_concat Teil anderer Meinung zu sein, wenn es nicht Ihren Anforderungen entsprechen; es enthält nur alle relevanten Sender anstelle einer willkürlich Kommissionierung.

Mein Vorschlag wäre, Ihre Datenbank in zwei Tabellen für eine bessere Normalisierung zu spalten: „Thread“ und „Nachricht“. Es gibt Thread Informationen, die auf alle Nachrichten gemeinsam sein würde, wie der Thread-Titel. Sie verschwenden Platz in der Nachrichtentabelle durch die gleichen Werte zu wiederholen.

können Sie haben ein „letzten Beitrag time“ Feld der Thread-Tabelle, die auf jeden neuen Beitrag aktualisiert. Dann ist es nur eine einfache Sache, der von der letzten Post von der Garnfarbentabelle und Bestellung auswählen. Es wird auch viel schneller sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top