Ett alternativ för att få alla par, oavsett om de är framåt eller bakåt (till exempel (1, 2) ==(2, 1)) är att välja LEAST()
och GREATEST()
från varje rad och välj sedan distinkta värden. Använder denna fråga:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Du får följande utdata:
| 1 | 2 |
| 1 | 3 |
När du väl har det kan du GRUPPERA efter dessa för att få maximalt datum för varje 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);
Den här frågan ger dig den data du behöver för varje par, men den returnerar inte den faktiska raden från din ursprungliga tabell. Om det finns en rad med formatet | 2 | 1 | 2014-10-15 |
denna fråga returnerar | 1 | 2 | 2014-10-15
.
För att få den ursprungliga raden från din tabell måste du JOIN
under förutsättning att alla nödvändiga kolumner matchar:
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;
Här är en SQL-fiol exempel som matchar dina förväntade resultat.