Salah satu opsi untuk mendapatkan semua pasangan, terlepas dari apakah mereka maju atau mundur (misalnya (1, 2) ==(2, 1)) adalah dengan memilih LEAST()
dan GREATEST()
dari setiap baris, lalu pilih nilai yang berbeda. Menggunakan kueri ini:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Anda akan mendapatkan output berikut:
| 1 | 2 |
| 1 | 3 |
Setelah Anda memilikinya, Anda dapat mengelompokkan ini untuk mendapatkan tanggal maksimum untuk setiap pasangan:
SELECT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id), MAX(created_at)
FROM myTable
GROUP BY LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id);
Kueri ini akan memberi Anda data yang Anda butuhkan untuk setiap pasangan, tetapi tidak akan mengembalikan baris sebenarnya dari tabel asli Anda. Jika ada deretan format | 2 | 1 | 2014-10-15 |
kueri ini akan mengembalikan | 1 | 2 | 2014-10-15
.
Untuk mendapatkan baris asli dari tabel Anda, Anda perlu JOIN
dengan syarat semua kolom yang diperlukan cocok:
SELECT m.*
FROM myTable m
JOIN(
SELECT LEAST(sender_id, recipient_id) AS least,
GREATEST(sender_id, recipient_id) AS greatest,
MAX(created_at) AS maxDate
FROM myTable
GROUP BY LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)) tmp
ON tmp.least = LEAST(m.sender_id, m.recipient_id) AND tmp.greatest = GREATEST(m.sender_id, m.recipient_id) AND tmp.maxDate = m.created_at;
Ini adalah SQL Fiddle contoh yang sesuai dengan hasil yang Anda harapkan.