sql >> Databáze >  >> RDS >> Mysql

Unikátní kombinace dvou sloupců v mysql nebo postgres

Jednou z možností, jak získat všechny páry, bez ohledu na to, zda jsou vpřed nebo vzad (například (1, 2) ==(2, 1)), je vybrat LEAST() a GREATEST() z každého řádku a poté vyberte odlišné hodnoty. Pomocí tohoto dotazu:

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

Získáte následující výstup:

| 1 | 2 |
| 1 | 3 |

Jakmile to budete mít, můžete seskupit podle nich, abyste získali maximální datum pro každý pár:

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);

Tento dotaz vám poskytne data, která potřebujete pro každý pár, ale nevrátí skutečný řádek z vaší původní tabulky. Pokud existuje řádek formátu | 2 | 1 | 2014-10-15 | tento dotaz vrátí | 1 | 2 | 2014-10-15 .

Chcete-li získat původní řádek z tabulky, musíte se JOIN za podmínky, že se všechny potřebné sloupce shodují:

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;

Zde je SQL Fiddle příklad, který odpovídá vašim očekávaným výsledkům.



  1. Exportujte konkrétní řádky z tabulky PostgreSQL jako INSERT SQL skript

  2. Vypočítejte nejbližší pracovní den v Postgres

  3. Java Oracle příkaz jdbc SELECT

  4. java.sql.SQLException:Vyčerpaná sada výsledků