Een optie om alle paren te krijgen, ongeacht of ze vooruit of achteruit zijn (bijvoorbeeld (1, 2) ==(2, 1)) is om de LEAST()
te selecteren en GREATEST()
uit elke rij en selecteer vervolgens afzonderlijke waarden. Met deze zoekopdracht:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
U krijgt de volgende uitvoer:
| 1 | 2 |
| 1 | 3 |
Als je dat eenmaal hebt, kun je deze groeperen om de maximale datum voor elk paar te krijgen:
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);
Deze query geeft u de gegevens die u nodig hebt voor elk paar, maar retourneert niet de werkelijke rij uit uw oorspronkelijke tabel. Als er een rij is met de indeling | 2 | 1 | 2014-10-15 |
deze zoekopdracht retourneert | 1 | 2 | 2014-10-15
.
Om de originele rij uit je tabel te halen, moet je JOIN
op voorwaarde dat alle benodigde kolommen overeenkomen:
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;
Hier is een SQL Fiddle voorbeeld dat overeenkomt met uw verwachte resultaten.