sql >> Database >  >> RDS >> Mysql

Unieke combinatie van twee kolommen in mysql of postgres

Een optie om alle paren te krijgen, ongeacht of ze vooruit of achteruit zijn (bijvoorbeeld (1, 2) ==(2, 1)) is om de LEAST() te selecteren en GREATEST() uit elke rij en selecteer vervolgens afzonderlijke waarden. Met deze zoekopdracht:

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

U krijgt de volgende uitvoer:

| 1 | 2 |
| 1 | 3 |

Als je dat eenmaal hebt, kun je deze groeperen om de maximale datum voor elk paar te krijgen:

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

Deze query geeft u de gegevens die u nodig hebt voor elk paar, maar retourneert niet de werkelijke rij uit uw oorspronkelijke tabel. Als er een rij is met de indeling | 2 | 1 | 2014-10-15 | deze zoekopdracht retourneert | 1 | 2 | 2014-10-15 .

Om de originele rij uit je tabel te halen, moet je JOIN op voorwaarde dat alle benodigde kolommen overeenkomen:

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;

Hier is een SQL Fiddle voorbeeld dat overeenkomt met uw verwachte resultaten.



  1. Converteer BibTex-bestand naar database-items met Python

  2. Primaire sleutel voor meerdere kolommen in PostgreSQL?

  3. Hoe dubbele records te vinden met behulp van Group by and Having-clausule in SQL Server - SQL Server / TSQL-zelfstudie, deel 132

  4. Algoritme dat zoekt naar gerelateerde items op basis van algemene tags