Grup Tarafından / Dişli Mesajlaşma MySQL Prob

2 Cevap php

Ben sorgu tarafından bir grup ile sorun yaşıyorsanız .. bir tanışma sitesi için özel mesajlaşma sistemini inşa ediyorum. Burada tablonun yapısı aşağıdaki gibidir:

`id` bigint (20) NOT NULL AUTO_INCREMENT , 
`fromme` integer (11) NOT NULL, 
`tome` integer (11) NOT NULL, 
`subject` varchar (255) NOT NULL, 
`message` longtext NOT NULL, 
`mydate` datetime NOT NULL, 
`thread` varchar (255) NOT NULL, 
`receipt` varchar (50) NOT NULL, 
`INDELETE` varchar (5), 
`SENTDELETE` varchar (5),
PRIMARY KEY (`id`)

Bir kullanıcı başka bir kullanıcının yeni bir mesaj gönderdiğinde, iplik takip etmek için rasgele bir dize oluşturur. Onlar cevap olarak, (facebook benzeri) iplik dize taşır. Bir kullanıcı oturum açtığında, onların gelsin iletileri görebilir ve yeni bir mesaj olup olmadığına göre, bu satırın bg rengini değiştirir. Tüm bu geri ve ileri dişli olmuştur aa mesajın alınması durumu hariç, gayet iyi çalışıyor. Bu sorgu:

select messages.id, messages.fromme, messages.subject, messages.message, messages.receipt, messages.mydate, messages.thread, users.firstname, users.lastname, users.image1
from messages, users
where messages.tome = '40' and messages.INDELETE !='y' and messages.fromme = users.id
GROUP BY messages.thread
ORDER BY messages.mydate desc

Bu şekilde döndürür, ancak işlevi ile grup ipliğin İLK mesajı dönüyor .. Ben düzgün bir şekilde çalışması için SON bir ihtiyaç. Herkes bunu nasıl biliyor?

2 Cevap

GROUP BY yan tümcesinde parası almak için bir toplama işlevi (MAX, SUM, COUNT, vb) gerek. Muhtemelen her iş parçacığı en son (en yüksek ID) mesaj çalışmak için bu alt sorgu kullanmak istiyorsanız:

select MAX(messages.id) id, messages.thread 
FROM messages
GROUP BY messages.thread

Kullanmak hep birlikte olabilir koymak

SELECT messages.id, 
       messages.fromme, 
       messages.subject, 
       messages.message, 
       messages.receipt, 
       messages.mydate, 
       messages.thread, 
       users.firstname, users.lastname, users.image1
  FROM messages, 
       users,
       (SELECT MAX(messages.id) id, messages.thread thread 
          FROM messages
        GROUP BY messages.thread) latest,
 WHERE messages.tome = '40' 
   AND messages.INDELETE !='y' 
   AND messages.fromme = users.id
   AND messages.id=latest.id
ORDER BY messages.mydate desc

Ollie Jones @ cevabı (eski SQL-89 virgül tarzı birleştirme sözdizimi hariç) gayet iyi, ama ne burada değer bir alternatiftir için:

SELECT m1.*, u.*
FROM messages m1
LEFT OUTER JOIN messages m2
  ON (m1.thread=m2.thread AND m1.mydate < m2.mydate)
JOIN users u ON (m1.fromme = u.id)
WHERE m2.thread IS NULL;

No GROUP BY gereklidir. Bu m1 aynı konu ve daha sonraki bir tarih olan varsayımsal bir satırda m2 her satırı eşleşir. Eşleşen bir satır m2 var, o zaman m1 parçacığı son mesaj olmalıdır.

O GROUP BY sorguları sıralar olarak MySQL, genellikle geçici bir tablo oluşturur, çünkü bu çözüm MySQL için iyidir. Katılmak çözüm genellikle daha hızlıdır. Emin (iplik, MyDate) üzerinde bir dizin var olun.