Un'opzione per ottenere tutte le coppie, indipendentemente dal fatto che siano avanti o indietro (ad esempio (1, 2) ==(2, 1)) è selezionare LEAST()
e GREATEST()
da ogni riga, quindi selezionare valori distinti. Usando questa query:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Otterrai il seguente output:
| 1 | 2 |
| 1 | 3 |
Una volta che lo hai, puoi GRUPPO in base a questi per ottenere la data massima per ogni coppia:
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);
Questa query ti fornirà i dati necessari per ogni coppia, ma non restituirà la riga effettiva dalla tabella originale. Se è presente una riga di formato | 2 | 1 | 2014-10-15 |
questa query restituirà | 1 | 2 | 2014-10-15
.
Per ottenere la riga originale dalla tua tabella, devi JOIN
a condizione che tutte le colonne necessarie corrispondano:
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;
Ecco un SQL Fiddle esempio che corrisponde ai risultati attesi.