Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhóm MySQL theo 2 cột khi các giá trị được hoán đổi cho nhau trong các cột

Một cách để xác định "luồng" cho mỗi hàng là CONCAT() LEAST trong hai số có GREATEST của hai số giống nhau.

Sau đó, chúng ta có thể GROUP BY trên "chuỗi", để tải generated_time mới nhất . Trong HAVING , chúng tôi chỉ lọc ra những "chuỗi" có ít nhất một 'INCOMING' tin nhắn với 'REVIEW' loại.

Xem trên 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;

Kết quả

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

Chú thích bên lề:

  1. Phương pháp tiếp cận ở trên (và thiết kế giản đồ hiện tại của bạn) không thể sử dụng các chỉ mục và do đó nó sẽ không hiệu quả .
  2. Tôi muốn thiết kế lại giản đồ bằng cách tạo thêm hai bảng Chính. Một bảng Chính sẽ lưu trữ các số điện thoại:phone_idnumber
  3. Một bảng Chính khác sẽ lưu trữ "Chuỗi", sẽ chứa phone_id giá trị và thread_id . Sau đó, bạn có thể sử dụng thread_id này trong message của bạn bảng, thay vì lưu trữ số điện thoại.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bị mắc lỗi này:Giá trị số nguyên không chính xác:'' cho cột '____' ở hàng 1

  2. Tại sao vẫn có các lệnh không đồng bộ; bạn không thể chạy lệnh này bây giờ lỗi

  3. Tự động loại bỏ các truy vấn đang chạy dài (MySql), Apache Tomcat DataSource

  4. Bài hát hùng hồn ở đâu trong tất cả

  5. MYSQL tìm hai trường văn bản khác nhau như thế nào?