Uma opção para obter todos os pares, independentemente de serem para frente ou para trás (por exemplo (1, 2) ==(2, 1)) é selecionar o
LEAST()
e GREATEST()
de cada linha e, em seguida, selecione valores distintos. Usando esta consulta:SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Você obterá a seguinte saída:
| 1 | 2 |
| 1 | 3 |
Depois de ter isso, você pode Agrupar por estes para obter a data 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);
Essa consulta fornecerá os dados necessários para cada par, mas não retornará a linha real da tabela original. Se houver uma linha de formato
| 2 | 1 | 2014-10-15 |
esta consulta retornará | 1 | 2 | 2014-10-15
. Para obter a linha original da sua tabela, você precisa
JOIN
com a condição de que todas as colunas necessárias correspondam: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;
Aqui está um SQL Fiddle exemplo que corresponda aos resultados esperados.