Jednou z možností, jak získat všechny páry, bez ohledu na to, zda jsou vpřed nebo vzad (například (1, 2) ==(2, 1)), je vybrat LEAST()
a GREATEST()
z každého řádku a poté vyberte odlišné hodnoty. Pomocí tohoto dotazu:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Získáte následující výstup:
| 1 | 2 |
| 1 | 3 |
Jakmile to budete mít, můžete seskupit podle nich, abyste získali maximální datum pro každý pár:
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);
Tento dotaz vám poskytne data, která potřebujete pro každý pár, ale nevrátí skutečný řádek z vaší původní tabulky. Pokud existuje řádek formátu | 2 | 1 | 2014-10-15 |
tento dotaz vrátí | 1 | 2 | 2014-10-15
.
Chcete-li získat původní řádek z tabulky, musíte se JOIN
za podmínky, že se všechny potřebné sloupce shodují:
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;
Zde je SQL Fiddle příklad, který odpovídá vašim očekávaným výsledkům.