En mulighed for at få alle par, uanset om de er frem eller tilbage (f.eks. (1, 2) ==(2, 1)), er at vælge LEAST()
og GREATEST()
fra hver række, og vælg derefter forskellige værdier. Brug af denne forespørgsel:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Du får følgende output:
| 1 | 2 |
| 1 | 3 |
Når du har det, kan du gruppere efter disse for at få den maksimale dato for hvert par:
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);
Denne forespørgsel vil give dig de data, du har brug for for hvert par, men den returnerer ikke den faktiske række fra din oprindelige tabel. Hvis der er en række med formatet | 2 | 1 | 2014-10-15 |
denne forespørgsel returnerer | 1 | 2 | 2014-10-15
.
For at få den originale række fra din tabel, skal du JOIN
på betingelse af, at alle de nødvendige kolonner matcher:
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;
Her er en SQL Fiddle eksempel, der matcher dine forventede resultater.