Saya pikir kueri Anda menghasilkan hasil yang "benar", seolah-olah Anda ingin melihat pesan terakhir di beberapa percakapan, Anda harus benar-benar mengelompokkan menurut conversation_id
. Saya tidak melihat Anda dalam bidang ini dalam skema.
Jika Anda melakukan WHERE sender_id = 3 GROUP BY receiver_id
, maka benar, kueri itu mengembalikan Anda pesan 1 dan 7, 'karena pesan-pesan itu telah dikirim ke berbeda orang, jadi dalam desain Anda, mereka adalah percakapan yang berbeda.
Jika Anda hanya ingin melihat pesan terakhir yang dikirim oleh Anda secara umum, hapus saja GROUP BY
di bagian kedua UNION
. Anda . Jika tidak, pertimbangkan untuk mendesain ulang skema Anda.
EDIT:
Coba kueri ini:
SELECT m.message_id, u.username, m.subject, m.message,
m.status, UNIX_TIMESTAMP(m.date) as `date`
FROM users u
LEFT JOIN messages m ON m.sender_id = u.id
WHERE m.message_id IN (
SELECT max(message_id)
FROM messages
WHERE receiver_id = 3 OR sender_id = 3
GROUP BY least(sender_id,receiver_id),
greatest(sender_id,receiver_id)
);
Beberapa catatan:
UNION
tidak diperlukan lagi;- Pendekatan ini akan memperlakukan semua email antara 2 pihak sebagai satu percakapan, yang tidak selalu benar. Anda mungkin ingin mendesain ulang pendekatan ini;
- Ini adalah gaya yang buruk untuk menggunakan kata-kata khusus (seperti
date
) untuk nama atau alias kolom, coba hindari ini. Atau gunakan backtick jika Anda menggunakannya.