sql >> Databasteknik >  >> RDS >> Mysql

Unik kombination av två kolumner i mysql eller postgres

Ett alternativ för att få alla par, oavsett om de är framåt eller bakåt (till exempel (1, 2) ==(2, 1)) är att välja LEAST() och GREATEST() från varje rad och välj sedan distinkta värden. Använder denna fråga:

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

Du får följande utdata:

| 1 | 2 |
| 1 | 3 |

När du väl har det kan du GRUPPERA efter dessa för att få maximalt datum för varje 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);

Den här frågan ger dig den data du behöver för varje par, men den returnerar inte den faktiska raden från din ursprungliga tabell. Om det finns en rad med formatet | 2 | 1 | 2014-10-15 | denna fråga returnerar | 1 | 2 | 2014-10-15 .

För att få den ursprungliga raden från din tabell måste du JOIN under förutsättning att alla nödvändiga kolumner matchar:

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;

Här är en SQL-fiol exempel som matchar dina förväntade resultat.



  1. Postgres-anslutningen är långsam från PHP

  2. Kan inte ansluta till PostgreSQL på distans på Amazon EC2-instans med PgAdmin

  3. Saknar höger parentes på Skapa tabell-kommandot SQL

  4. 'MSDAORA.1'-leverantören är inte registrerad på den lokala maskinen