2

我有一张像这样的桌子:

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

4 回答 4

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
于 2013-03-19T12:53:00.623 回答
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 才能删除所有重复值。

于 2013-03-20T07:53:12.587 回答
0

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

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

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

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

于 2013-03-19T12:52:05.697 回答
0

你也可以使用DISTINCT

select distinct name from my_table 
于 2013-03-19T12:52:44.480 回答