Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Combinação única de duas colunas no mysql ou postgres


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.