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

Làm cách nào để chọn và / hoặc xóa tất cả trừ một hàng của mỗi tập hợp các bản sao trong bảng?

Đây là một giải pháp. Tôi đã thử nghiệm điều này trên MySQL 5.5.8.

SELECT MAX(COALESCE(c2.id, c1.id)) AS id,
 c1.driver_id, c1.car_id,
 c2.notes AS notes
FROM cars_drivers AS c1
LEFT OUTER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id) AND c2.notes IS NOT NULL
GROUP BY c1.driver_id, c1.car_id, c2.notes;

Tôi bao gồm c2.notes dưới dạng khóa GROUP BY vì bạn có thể có nhiều hơn một hàng với các ghi chú không rỗng cho mỗi giá trị của driver_id, car_id.

Kết quả bằng cách sử dụng dữ liệu mẫu của bạn:

+------+-----------+--------+-------+
| id   | driver_id | car_id | notes |
+------+-----------+--------+-------+
|    2 |         1 |      1 | NULL  |
|    4 |         2 |      1 | NULL  |
|    8 |         3 |      2 | hi    |
|    9 |         5 |      3 | NULL  |
+------+-----------+--------+-------+

Về việc xóa. Trong dữ liệu mẫu của bạn, nó luôn là giá trị id cao nhất trên mỗi driver_id &car_id mà bạn muốn giữ lại. Nếu bạn có thể phụ thuộc vào điều đó, bạn có thể thực hiện xóa nhiều bảng để xóa tất cả các hàng mà hàng có giá trị id cao hơn và cùng driver_id &car_id tồn tại:

DELETE c1 FROM cars_drivers AS c1 INNER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id) AND c1.id < c2.id;

Điều này tự nhiên bỏ qua mọi trường hợp chỉ tồn tại một hàng với một cặp giá trị driver_id &car_id nhất định, vì các điều kiện của phép nối bên trong yêu cầu hai hàng có giá trị id khác nhau.

Nhưng nếu bạn không thể phụ thuộc vào id mới nhất của mỗi nhóm là id bạn muốn giữ, thì giải pháp phức tạp hơn. Nó có lẽ phức tạp hơn mức đáng để giải quyết trong một câu lệnh, vì vậy hãy làm nó trong hai câu lệnh.

Tôi cũng đã thử nghiệm điều này, sau khi thêm một vài hàng nữa để thử nghiệm:

INSERT INTO cars_drivers VALUES (10,2,3,NULL), (11,2,3,'bye');

+----+--------+-----------+-------+
| id | car_id | driver_id | notes |
+----+--------+-----------+-------+
|  1 |      1 |         1 | NULL  |
|  2 |      1 |         1 | NULL  |
|  3 |      1 |         2 | NULL  |
|  4 |      1 |         2 | NULL  |
|  5 |      2 |         3 | NULL  |
|  6 |      2 |         3 | NULL  |
|  7 |      2 |         3 | NULL  |
|  8 |      2 |         3 | hi    |
|  9 |      3 |         5 | NULL  |
| 10 |      2 |         3 | NULL  |
| 11 |      2 |         3 | bye   |
+----+--------+-----------+-------+

Trước tiên, hãy xóa các hàng có ghi chú rỗng, trong đó một hàng có ghi chú không phải là rỗng tồn tại.

DELETE c1 FROM cars_drivers AS c1 INNER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id)
WHERE c1.notes IS NULL AND c2.notes IS NOT NULL;

+----+--------+-----------+-------+
| id | car_id | driver_id | notes |
+----+--------+-----------+-------+
|  1 |      1 |         1 | NULL  |
|  2 |      1 |         1 | NULL  |
|  3 |      1 |         2 | NULL  |
|  4 |      1 |         2 | NULL  |
|  8 |      2 |         3 | hi    |
|  9 |      3 |         5 | NULL  |
| 11 |      2 |         3 | bye   |
+----+--------+-----------+-------+

Thứ hai, xóa tất cả trừ hàng id cao nhất khỏi mỗi nhóm trùng lặp.

DELETE c1 FROM cars_drivers AS c1 INNER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id) AND c1.id < c2.id;

+----+--------+-----------+-------+
| id | car_id | driver_id | notes |
+----+--------+-----------+-------+
|  2 |      1 |         1 | NULL  |
|  4 |      1 |         2 | NULL  |
|  9 |      3 |         5 | NULL  |
| 11 |      2 |         3 | bye   |
+----+--------+-----------+-------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn sử dụng group_concat chỉ trả về một hàng

  2. Hiển thị tất cả các khóa hiện tại từ get_lock

  3. Chèn SQL với các giá trị được chọn và mã hóa cứng

  4. Làm thế nào để sử dụng PATCH để cập nhật một trường cơ sở dữ liệu đơn giản?

  5. Bộ lọc $ không hoạt động trong JPA / Olingo 2.0.11 với MySQL