在 MySQL 中,可以使用以下查询删除重复数据,只保留 ID 最大的那条记录:
SQL
DELETE t
FROM table_name t
LEFT JOIN (
SELECT column_name, MAX(id) AS max_id
FROM table_name
GROUP BY column_name
) t2
ON t.column_name = t2.column_name
AND t.id <> t2.max_id;
Use code with caution.
解释:
DELETE t FROM table_name t:此部分删除表 table_name 中的所有行。
LEFT JOIN:此联结将 table_name 表中的所有行与派生表中的匹配行进行连接。派生表由以下部分组成:
SELECT column_name, MAX(id) AS max_id FROM table_name GROUP BY column_name:此部分为每个重复值组(由 column_name 列的值确定)选择 column_name 和 id 的最大值。
ON t.column_name = t2.column_name AND t.id <> t2.max_id:此联结条件确保仅将 table_name 表中的行与派生表中具有相同 column_name 值但 id 值较小的行进行连接。
注意:
此查询将删除所有重复数据,只保留每个重复值组中 ID 最大的那条记录。
如果您有多个要删除重复数据的列,则可以将它们添加到 column_name 列表中。
如果您只想删除特定值范围内的重复数据,可以使用 WHERE 子句来过滤结果。
示例:
假设您有一个名为 users 的表,其中包含以下列:
id:主键
name:用户姓名
email:用户电子邮件地址
要删除每个电子邮件地址重复的记录,只保留 ID 最大的那条记录,可以使用以下查询:
SQL
DELETE u
FROM users u
LEFT JOIN (
SELECT email, MAX(id) AS max_id
FROM users
GROUP BY email
) t2
ON u.email = t2.email
AND u.id <> t2.max_id;
Use code with caution.
此查询将删除所有重复的电子邮件地址,只保留每个电子邮件地址中 ID 最大的那条记录。
替代方法:
另一种删除重复数据的方法是使用以下查询:
SQL
SELECT column_name, MAX(id) AS max_id
FROM table_name
GROUP BY column_name;
Use code with caution.
此查询将返回每个重复值组的 column_name 和 id 的最大值。然后,您可以使用以下查询删除所有重复数据,只保留这些最大 ID 值:
SQL
DELETE FROM table_name
WHERE id NOT IN (
SELECT max_id
FROM (
SELECT column_name, MAX(id) AS max_id
FROM table_name
GROUP BY column_name
) t
);
Use code with caution.
此查询将从 table_name 表中删除所有不等于 max_id 的行,其中 max_id 是每个重复值组的最大 ID 值。
哪个方法更好?
第一个查询通常比第二个查询更有效,因为它只需要执行一次联结。但是,第二个查询可能更容易理解,尤其是如果您不熟悉派生表。
我希望这些信息对您有所帮助。如果您有任何其他问题,请告诉我。