Domanda

Al momento ho le seguenti tabelle per un forum di messaggistica privato:

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

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

Quello che sto cercando di fare è generare una "casella di posta" " che visualizza il thread più recente nella parte superiore e raggruppa per thread (ovvero, non vedi lo stesso thread due volte nella posta in arrivo), indipendentemente da chi sia il mittente.

Quello che ho adesso funziona benissimo per messaggi semplici tra 2 anni. Tuttavia, una volta che un terzo utente risponde allo stesso thread, non viene visualizzato correttamente. La mia domanda attuale è questa:

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

Supponendo che $ usrID = 68 (quindi, receiver_id = 68), genera questo:

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)

Nota come il thread_id (13587) si presenta due volte perché ci sono 2 mittenti diversi.

Come potrei averlo solo visualizzare il thread_id più recente, non importa chi sia il mittente?

Mille grazie !!

È stato utile?

Soluzione

In realtà sembra che la query nella domanda originale richieda solo una piccola modifica per ottenere il record più recente effettivo per ogni thread.

  1. rilascia il mittente_id nei campi GROUP BY della sottoquery
  2. rilascia il pm_data.sender_id = deriv1.sender_id nella clausola 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

Come nota a margine: se possibile, cerca il messageID massimo in quella subquery invece di max (date_sent)

Altri suggerimenti

Prova

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

Prova

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;

Sentiti libero di non essere d'accordo con la parte group_concat, se non soddisfa le tue esigenze; elenca solo tutti i mittenti pertinenti invece di sceglierne uno arbitrariamente.

Il mio suggerimento sarebbe di dividere il database in due tabelle per una migliore normalizzazione: " thread " e "messaggio". Ci sono informazioni sul thread che sarebbero comuni a tutti i messaggi, come il titolo del thread. Stai sprecando spazio nella tabella dei messaggi ripetendo gli stessi valori.

Puoi avere un " ora dell'ultimo post " campo la tabella dei thread, che viene aggiornata su ogni nuovo post. Quindi è solo una questione di selezione dalla tabella dei thread e ordinamento per l'ultimo post. Sarà anche molto più veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top