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

Grup MySQL dengan 2 kolom ketika nilai dipertukarkan dalam kolom

Salah satu cara untuk menentukan "utas" untuk setiap baris adalah CONCAT() LEAST dari dua angka dengan GREATEST dari dua bilangan yang sama.

Kami kemudian dapat GROUP BY di "utas", untuk mendapatkan generated_time terbaru . Di HAVING klausa, kami memfilter hanya "utas", yang memiliki setidaknya satu 'INCOMING' pesan dengan 'REVIEW' ketik.

Lihat di DB Fiddle

SELECT m1.*
FROM   message AS m1
       JOIN (SELECT Concat(Least(m.from_number, m.to_number), '|',
                                                      Greatest(m.from_number,
                                                      m.to_number))
                                              AS
                    thread,
                    Max(m.generated_time)
                                              AS max_generated_time
             FROM   message AS m
             GROUP  BY thread
             HAVING Sum(m.direction = 'INCOMING'
                        AND m.type = 'REVIEW')) AS dt
         ON dt.thread = Concat(Least(m1.from_number, m1.to_number), '|',
                                         Greatest(m1.from_number, m1.to_number))
            AND dt.max_generated_time = m1.generated_time;

Hasil

| id  | to_number    | from_number  | message         | direction | type   | generated_time      |
| --- | ------------ | ------------ | --------------- | --------- | ------ | ------------------- |
| 3   | +15005550004 | +16232950692 | How are you ?   | OUTGOING  |        | 2019-07-13 21:15:00 |
| 5   | +16232950692 | +15005550001 | Have a nice day | INCOMING  | REVIEW | 2019-07-12 12:17:00 |

Catatan Tambahan:

  1. Pendekatan di atas (dan desain skema Anda saat ini) tidak dapat menggunakan indeks, dan karenanya tidak akan berperforma .
  2. Saya lebih suka mendesain ulang skema dengan membuat dua tabel Master tambahan. Satu tabel Master akan menyimpan nomor telepon:phone_id , dan number
  3. Tabel Master lain akan menyimpan "Utas", yang akan berisi phone_id nilai dan thread_id . Anda kemudian dapat menggunakan thread_id ini di message . Anda tabel, alih-alih menyimpan nomor telepon.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mengatur Lokal untuk Koneksi Saat Ini di MySQL

  2. Bantu mengedit JSON untuk membuat array daripada 'kamus'

  3. kunci tabel setelah Transaksi MySql BeginTransaction di c#.net

  4. sql bergabung di dua bidang dalam satu tabel

  5. PHP drop down yang masing-masing dapat diandalkan