MySQL Select Bildirimi - Mesajlar için

4 Cevap php

Ben şu anda bir özel mesajlaşma forum için aşağıdaki tablolar vardır:

alt text

alt text

Ne yapmaya çalışıyorum parçacığı tarafından üst ve grubunda en son konu görüntüleyen bir "gelen kutusu" çıkışı olursa olsun gönderenin kim olduğunu, (anlamı, gelen kutunuzda iki kez aynı konu görmüyorum).

Ne şu anda sahip 2 uesrs arasında basit mesajlar için çalışıyor. Üçüncü bir kullanıcı aynı konuya cevap Ancak, bir kez doğru göstermez. Benim geçerli sorgu şudur:

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

= 68 $ usrID (dolayısıyla, receiver_id = 68), bu çıkışları olduğunu varsayarsak:

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)

2 farklı gönderenler vardır çünkü thread_id (13587) kez gösterir nasıl fark.

Nasıl ben just olursa olsun gönderen kim olduğunu, en son thread_id görüntülemek olabilir?

Çok teşekkürler!

4 Cevap

Asıl soruya sorgu sadece her iş parçacığı için gerçek en son kayıt almak için çok küçük bir değişikliği gerektirir gibi aslında görünüyor.

  1. alanları BY alt sorguda en GROUP sender_id bırakın
  2. ON yan tümcesinde * * pm_data.sender_id = deriv1.sender_id bırakın
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

Bir yan not olarak: Eğer mümkünse, bunun yerine max bu sorguda max MessageID (date_sent aramak)

Denemek

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

Denemek

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;

Feel free to disagree with the group_concat part, if it doesn't meet your needs; it just lists all of the relevant senders instead of picking one arbitrarily.

"Iplik" ve "mesaj": Benim önerim daha normalleşmesi için iki tablo halinde veritabanını bölmek olacaktır. Iplik başlık gibi, tüm mesajlar için ortak olacaktır iplik bilgi yoktur. Sen aynı değerleri tekrarlayarak ileti tabloda yer harcıyorsun.

Sen her yeni yazı güncellenen bir "son yazılan zaman" alanını iplik tablo olabilir. Sonra son yazılan tarafından iplik tablosu ve sipariş seçerek sadece basit bir mesele. Bu çok çok daha hızlı olacaktır.