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

Sự kết hợp độc đáo của hai cột trong mysql hoặc postgres

Một tùy chọn để nhận tất cả các cặp, bất kể chúng là tiến hay lùi (ví dụ:(1, 2) ==(2, 1)) là chọn LEAST()GREATEST() từ mỗi hàng, rồi chọn các giá trị riêng biệt. Sử dụng truy vấn này:

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

Bạn sẽ nhận được kết quả sau:

| 1 | 2 |
| 1 | 3 |

Khi bạn có điều đó, bạn có thể NHÓM theo những thứ này để có ngày tối đa cho mỗi cặp:

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

Truy vấn này sẽ cung cấp cho bạn dữ liệu bạn cần cho mỗi cặp, nhưng nó sẽ không trả về hàng thực từ bảng ban đầu của bạn. Nếu có một hàng định dạng | 2 | 1 | 2014-10-15 | truy vấn này sẽ trả về | 1 | 2 | 2014-10-15 .

Để lấy hàng ban đầu từ bảng của bạn, bạn cần phải JOIN với điều kiện tất cả các cột cần thiết phải khớp:

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;

Đây là SQL Fiddle ví dụ phù hợp với kết quả mong đợi của bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thông báo lỗi Cú pháp MySQL Toán hạng phải chứa 1 (các) cột

  2. ý nghĩa của select '' - ''

  3. Lỗi ETIMEOUT | Cơ sở dữ liệu Google Cloud SQL với NodeJS

  4. Giám sát cơ sở dữ liệu của bạn với MySQL Enterprise Monitor

  5. Phương thức has_header của Ruby tìm kiếm các tệp tiêu đề ở đâu?