Una opción para obtener todos los pares, independientemente de si están hacia adelante o hacia atrás (por ejemplo (1, 2) ==(2, 1)) es seleccionar LEAST()
y GREATEST()
de cada fila y, a continuación, seleccione valores distintos. Usando esta consulta:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Obtendrá el siguiente resultado:
| 1 | 2 |
| 1 | 3 |
Una vez que tenga eso, puede AGRUPAR por estos para obtener la fecha máxima para cada 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);
Esta consulta le dará los datos que necesita para cada par, pero no devolverá la fila real de su tabla original. Si hay una fila de formato | 2 | 1 | 2014-10-15 |
esta consulta devolverá | 1 | 2 | 2014-10-15
.
Para obtener la fila original de su tabla, debe JOIN
con la condición de que todas las columnas necesarias coincidan:
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;
Aquí hay un SQL Fiddle ejemplo que coincida con los resultados esperados.