Mysql 删除所有值并保留一个

Mysql 删除所有值并保留一个,mysql,database,database-design,Mysql,Database,Database Design,我有一张像这样的桌子: uid | name | user_id -------------------- 1 | aaa | 111 2 | bbb | 111 3 | ccc | 222 4 | aaa | 222 5 | vvv | 333 6 | zzz | 333 7 | aaa | 111 8 | bbb | 111 我想写一个查询,就像它将删除所有名称aaa,但只保留一次aaa 输出如下: uid | name | user_

我有一张像这样的桌子:

uid | name | user_id
--------------------
1   | aaa  | 111 
2   | bbb  | 111
3   | ccc  | 222
4   | aaa  | 222
5   | vvv  | 333
6   | zzz  | 333
7   | aaa  | 111
8   | bbb  | 111
我想写一个查询,就像它将删除所有名称
aaa
,但只保留一次
aaa

输出如下:

  uid | name | user_id
  --------------------
    1 | aaa  | 111
    2 | bbb  | 111
    3 | ccc  | 222
    4 | aaa  | 222
    5 | vvv  | 333
    6 | zzz  | 333

可以通过查询来实现吗?

是的,不过您需要小心处理这个问题

ALTER IGNORE TABLE `table` ADD UNIQUE `name`;
(如果不起作用,请检查文档中的确切语法)


这将使“名称”列变得唯一,并无情地删除所有重复条目。

您也可以使用
DISTINCT

select distinct name from my_table 

尝试这样的方法会奏效的
如果要保留id值最低的行

DELETE n1 FROM tablename n1, tablename n2 WHERE n1.uid > n2.uid AND n1.name = n2.name
如果要保留id值最高的行

DELETE n1 FROM tablename n1, tablename n2 WHERE n1.uid < n2.uid AND n1.name = n2.name
从tablename n1、tablename n2中删除n1,其中n1.uid

您必须比较name和uid来删除所有重复的值。

这不会改变表的内容。不会,但可以将输出重定向到新表。我假设
name
是假定的表名吗?
DELETE  a
FROM    table tbl
        LEFT JOIN
        (
            SELECT  user_id, MIN(uid) min_uid, name
            FROM    table
            GROUP   BY user_id, name
        ) tbl1 ON  tbl.user_id = tbl1.user_id AND
                tbl.uid = tbl1.min_uid AND
                tbl.name = tbl1.name
WHERE   tbl1.user_id IS NULL