删除所有值并留下一个

时间:2013-03-19 12:50:07

标签: 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_id
  --------------------
    1 | aaa  | 111
    2 | bbb  | 111
    3 | ccc  | 222
    4 | aaa  | 222
    5 | vvv  | 333
    6 | zzz  | 333

是否可以通过查询。?

4 个答案:

答案 0 :(得分:1)

尝试类似的东西它会起作用 如果你想保持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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

是的,虽然你需要小心这个。

ALTER IGNORE TABLE `table` ADD UNIQUE `name`;

(如果这不起作用,请检查文档中的确切语法)

这将使'name'列唯一,并且无情地删除所有重复的条目。

答案 3 :(得分:0)

您也可以使用DISTINCT

select distinct name from my_table