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

Unik kombination af to kolonner i mysql eller postgres

En mulighed for at få alle par, uanset om de er frem eller tilbage (f.eks. (1, 2) ==(2, 1)), er at vælge LEAST() og GREATEST() fra hver række, og vælg derefter forskellige værdier. Brug af denne forespørgsel:

SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
 

Du får følgende output:

| 1 | 2 | | 1 | 3 |

Når du har det, kan du gruppere efter disse for at få den maksimale dato for hvert 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);
 

Denne forespørgsel vil give dig de data, du har brug for for hvert par, men den returnerer ikke den faktiske række fra din oprindelige tabel. Hvis der er en række med formatet | 2 | 1 | 2014-10-15 | denne forespørgsel returnerer | 1 | 2 | 2014-10-15 .

For at få den originale række fra din tabel, skal du JOIN på betingelse af, at alle de nødvendige kolonner matcher:

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;

Her er en SQL Fiddle eksempel, der matcher dine forventede resultater.



  1. Sådan opretter du et rullebart, opdaterbart ResultSet-objekt i JDBC

  2. Hvad knytter Hibernate en boolesk datatype til, når der som standard bruges en Oracle-database?

  3. Udskrivning af tegn én efter én fra en streng(VARCHAR2) oracle sql uden at bruge plsql og også uden at bruge dual

  4. Sammenligning af rækker i tabel for forskelle mellem felter