Jedną z opcji, aby uzyskać wszystkie pary, niezależnie od tego, czy są do przodu, czy do tyłu (na przykład (1, 2) ==(2, 1)), jest wybranie LEAST()
i GREATEST()
z każdego wiersza, a następnie wybierz różne wartości. Używając tego zapytania:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Otrzymasz następujące dane wyjściowe:
| 1 | 2 |
| 1 | 3 |
Gdy już to zrobisz, możesz GRUPOWAĆ według tych, aby uzyskać maksymalną datę dla każdej pary:
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);
To zapytanie da ci potrzebne dane dla każdej pary, ale nie zwróci rzeczywistego wiersza z oryginalnej tabeli. Jeśli istnieje wiersz formatu | 2 | 1 | 2014-10-15 |
to zapytanie zwróci | 1 | 2 | 2014-10-15
.
Aby pobrać oryginalny wiersz ze swojej tabeli, musisz JOIN
pod warunkiem, że wszystkie niezbędne kolumny pasują do siebie:
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;
Oto SQL Fiddle przykład, który pasuje do oczekiwanych wyników.