sql >> Base de Datos >  >> RDS >> Mysql

Combinación única de dos columnas en mysql o postgres

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.