Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kombinasi unik dari dua kolom di mysql atau postgres

Salah satu opsi untuk mendapatkan semua pasangan, terlepas dari apakah mereka maju atau mundur (misalnya (1, 2) ==(2, 1)) adalah dengan memilih LEAST() dan GREATEST() dari setiap baris, lalu pilih nilai yang berbeda. Menggunakan kueri ini:

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

Anda akan mendapatkan output berikut:

| 1 | 2 |
| 1 | 3 |

Setelah Anda memilikinya, Anda dapat mengelompokkan ini untuk mendapatkan tanggal maksimum untuk setiap pasangan:

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

Kueri ini akan memberi Anda data yang Anda butuhkan untuk setiap pasangan, tetapi tidak akan mengembalikan baris sebenarnya dari tabel asli Anda. Jika ada deretan format | 2 | 1 | 2014-10-15 | kueri ini akan mengembalikan | 1 | 2 | 2014-10-15 .

Untuk mendapatkan baris asli dari tabel Anda, Anda perlu JOIN dengan syarat semua kolom yang diperlukan cocok:

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;

Ini adalah SQL Fiddle contoh yang sesuai dengan hasil yang Anda harapkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO FetchObject menjadi atribut Object; OOP di PHP

  2. Permintaan MySql sederhana saya tidak menggunakan indeks

  3. Menerapkan tabel asosiasi

  4. Memilih database di mysql dengan spasi di namanya

  5. MySQL dipesan oleh sebelum dikelompokkan berdasarkan