我有一张表:
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
是否可以通过查询。?
答案 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