Mysql
 sql >> Database >  >> RDS >> Mysql

Combinazione unica di due colonne in mysql o postgres

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.