mysql - 删除重复的条目,同时保留一个

标签 mysql sql

我有一个表,但它没有唯一 ID 或主键。

它总共有 3 列。

<表类="s-表"> <头> 名字 user_id role_id <正文> 本 1 2 本 1 2 山姆 1 3

我想删除一个名为 Ben 的条目。

所以输出看起来像这样

<表类="s-表"> <头> 名字 user_id role_id <正文> 本 1 2 山姆 1 3

大多数示例显示删除具有 ID 或主键的重复条目。但是,如何在删除其他条目的同时保留一个条目?

使用下面的查询我能够得到重复的行

SELECT name, user_id, role_id, count(*) FROM some_table
GROUP BY name, user_id, role_id
HAVING count(*) > 1

澄清一下,我希望删除这些行。

最好不要创建新表。

最佳答案

如果不用担心其他用户访问该表——

CREATE TABLE `new_table` AS
SELECT DISTINCT `name`, `user_id`, `role_id`
FROM `old_table`;

RENAME TABLE
    `old_table` TO `backup`,
    `new_table` TO `old_table`;

或者您可以使用重复查询来输出大量单行删除查询 -

SELECT
    `name`,
    `user_id`,
    `role_id`,
    COUNT(*),
    CONCAT('DELETE FROM some_table WHERE name=\'', `name`, '\' AND user_id=\'', `user_id`, '\' AND role_id=\'', `role_id`, '\' LIMIT 1;') AS `delete_stmt`
FROM `some_table`
GROUP BY `name`, `user_id`, `role_id`
HAVING COUNT(*) > 1;

或者你可以临时添加一个 SERIAL 列,然后在删除后删除它 -

ALTER TABLE `some_table` ADD COLUMN `temp_id` SERIAL;

DELETE `t1`.* 
FROM `some_table` `t1`
LEFT JOIN (
    SELECT MIN(`temp_id`) `min_temp_id`
    FROM `some_table`
    GROUP BY `name`, `user_id`, `role_id`
) `t2` ON `t1`.`temp_id` = `t2`.`min_temp_id`
WHERE `t2`.`min_temp_id` IS NULL;

ALTER TABLE `some_table` DROP COLUMN `temp_id`;

关于mysql - 删除重复的条目,同时保留一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70342021/

相关文章:

php - 如何在php中从mysql数据库中获取图像

java - 使用 JSB 在 MySql 数据库表中搜索

sql - SQL 探查器中是否有一种方法可以通过 'TextData' 过滤器和 OR 条件来过滤多个文本条件?

sql - SQL Server中有类似 "Only IN"这样的关键字吗?

sql - 当所有子记录满足条件时只选择父记录

.net - 我应该在数据访问层中保留sqlconnection吗?

sql - 如何在 Oracle Sql Developer 中查看解释计划?

java - 删除 OneToMany 关系中的父级后为 "Cannot delete or update a parent row"

mysql - 连接mysql不起作用

php - 如何获取MySQL表中的最小ID值和最大ID值