Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Xóa hàng trùng lặp & tương tự, giữ hàng có số lớn nhất với SELECT MySQL

Tạo bảng:

mysql> CREATE TABLE DemoTable1468 ( Id INT, Name VARCHAR(20), Age INT ); Query OK, 0 rows affected (1.21 sec)

Chèn bản ghi (có trùng lặp):

mysql> INSERT INTO DemoTable1468 VALUES(100,'Chris',23); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable1468 VALUES(101,'Bob',25); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO DemoTable1468 VALUES(102,'David',30); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO DemoTable1468 VALUES(100,'Chris',23); Query OK, 1 row affected (0.35 sec) mysql> INSERT INTO DemoTable1468 VALUES(100,'Chris',38); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO DemoTable1468 VALUES(101,'Bob',23); Query OK, 1 row affected (0.13 sec)

Hiển thị:

mysql> SELECT * FROM DemoTable1468;

Kết quả:

+------+-------+------+ | Id   | Name  | Age  | +------+-------+------+ | 100  | Chris | 23   | | 101  | Bob   | 25   | | 102  | David | 30   | | 100  | Chris | 23   | | 100  | Chris | 38   | | 101  | Bob   | 23   | +------+-------+------+ 6 rows in set (0.00 sec)

Truy vấn xóa trùng lặp và lấy hàng có Age lớn nhất theo nhóm Name, Id:

mysql> SELECT Id, Name, Age FROM DemoTable1468 GROUP BY Name, Id HAVING MAX(Age);

Kết quả:

+------+-------+------+ | Id   | Name  | Age  | +------+-------+------+ | 100  | Chris | 23   | | 101  | Bob   | 25   | | 102  | David | 30   | +------+-------+------+ 3 rows in set (0.00 sec)

Lưu ý: Kết quả ví dụ gốc có vẻ không trả về Age=38 cho Chris (Id=100) do cơ chế GROUP BY/HAVING trong MySQL phiên bản cũ. Để chính xác hơn, nên dùng ROW_NUMBER() hoặc JOIN subquery MAX.