Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einzigartige Kombination von zwei Spalten in mysql oder postgres

Eine Option, um alle Paare zu erhalten, unabhängig davon, ob sie vorwärts oder rückwärts sind (z. B. (1, 2) ==(2, 1)), besteht darin, LEAST() auszuwählen und GREATEST() aus jeder Zeile und wählen Sie dann unterschiedliche Werte aus. Mit dieser Abfrage:

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

Sie erhalten die folgende Ausgabe:

| 1 | 2 |
| 1 | 3 |

Sobald Sie das haben, können Sie nach diesen gruppieren, um das maximale Datum für jedes Paar zu erhalten:

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

Diese Abfrage liefert Ihnen die Daten, die Sie für jedes Paar benötigen, gibt jedoch nicht die tatsächliche Zeile aus Ihrer ursprünglichen Tabelle zurück. Wenn eine Zeile im Format | 2 | 1 | 2014-10-15 | Diese Abfrage gibt | 1 | 2 | 2014-10-15 .

Um die ursprüngliche Zeile aus Ihrer Tabelle zu erhalten, müssen Sie JOIN ausführen unter der Bedingung, dass alle erforderlichen Spalten übereinstimmen:

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 ist ein SQL Fiddle Beispiel, das Ihren erwarteten Ergebnissen entspricht.