Đây có thể là một giải pháp cho vấn đề của bạn.
Tuy nhiên, vì không có cột ngày-giờ nên tôi giả định rằng cột id là khóa chính. Và nó là Auto_increment
. Vì vậy, giả định của tôi là số càng lớn thì bản ghi càng mới. (nó phải đúng trừ khi bạn có một số dữ liệu cũ được đưa vào bảng)
Đảm bảo rằng bạn đã sao lưu dữ liệu của mình trước khi xóa vì điều này sẽ khiến bạn bị mất dữ liệu vĩnh viễn. Tốt hơn nữa, bạn có thể tạo một bản sao của bảng hiện tại thành một bảng khác và làm việc trên bảng mới để đảm bảo logic bên dưới là chính xác. Sau đó, thay đổi các truy vấn mà tôi có bên dưới để đọc từ tbl_new
thay vào đó trên tbl
bạn có thể sao chép bảng của mình thông qua một cái gì đó như
CREATE TABLE tbl_new LIKE tbl;
Tôi đã để lại nhận xét cho mọi truy vấn
DROP TEMPORARY TABLE IF EXISTS keepers1, keepers2, keepers_all;
-- get the #1 top records
CREATE TEMPORARY TABLE keepers1 (KEY(id)) ENGINE=MEMORY AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
-- get the #2 top records
CREATE TEMPORARY TABLE keepers2 AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl AS k
WHERE NOT EXISTS (SELECT 1 FROM keepers1 WHERE id = k.id)
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
-- create a temp table where you have all he ids that you want to keep
CREATE TEMPORARY TABLE keepers_all (KEY(id)) ENGINE=MEMORY AS
SELECT id FROM keepers1
UNION ALL
SELECT id FROM keepers2;
-- delete all records that you don't want to keep
DELETE k.* FROM tbl AS k WHERE NOT EXISTS (SELECT 1 FROM keepers_all WHERE id = k.id);
nếu đây là công việc dọn dẹp một lần thì bạn sẽ có thể thực hiện các truy vấn từ bảng điều khiển. nhưng nếu bạn đang tìm kiếm một Công việc tuyển dụng cho họ, bạn có thể nên lấy mã này và đưa nó vào một quy trình.
Lưu ý:ở đây tôi đang sử dụng bảng TẠM THỜI BỘ NHỚ để có hiệu suất tốt hơn. Bạn có thể gặp sự cố cho biết "Bảng đã đầy" điều này là do bạn có quá nhiều hồ sơ. thì bạn có thể tăng giá trị max_heap_table_size cho các phiên như
SET SESSION tmp_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
SET SESSION max_heap_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
Điều này sẽ cung cấp cho bạn giá trị hiện tại của bạn
SELECT VARIABLES LIKE 'max_heap_table_size';
SELECT VARIABLES LIKE 'tmp_table_size';