lintcode-1922 · 删除重复的姓名

360 阅读1分钟

描述

编写一个 SQL 语句,来删除 contacts 表中所有重复的姓名,重复的姓名里只保留 id 最小的那个。

表定义: contacts (联络表)

列名类型注释
idint unsigned主键
namevarchar姓名

**

使用 delete 语句 执行你的 SQL 语句之后,返回的是整个 contacts 表 我们会单独验证数据库中的数据是否都被修改为如下的信息。

样例

样例一:

表内容: contacts

idname
1Song Jiang
2Lu Junyi
3Wu Yong
4Song Jiang
5Wu Yong
6Lin Chong

在运行你的 SQL 语句之后,上面的 contacts 表应返回以下几行:

idname
1Song Jiang
2Lu Junyi
3Wu Yong
6Lin Chong

样例二:

表内容: contacts

idname
1Song Jiang
2Lu Junyi
3Wu Yong
4Song Jiang

在运行你的 SQL 语句之后,上面的 contacts 表应返回以下几行:

idname
1Song Jiang
2Lu Junyi
3Wu Yong

题解

mysql delete:

DELETE FROM table_name [WHERE Clause]


-   如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
-   你可以在 WHERE 子句中指定任何条件
-   可以在单个表中一次性删除记录。

仔细看本题的要求:重复的姓名里只保留 id 最小的那个,所以这里只要找到最小的id,然后不是最小id的数据直接删除就可以了。因为id是主键,不必担心有重复的id. 思路:首先使用group by 按照姓名分组,然后使用min函数找到最小的id。最后使用delete进行删除。这里使用的not in 来判断是不是最小的id。


delete from contacts
where id not in (
 select *
 from (
     select min(id)
     from contacts
     group by name
 ) 

)