这段代码在MySQL 5.0上无法运行,如何改写以使其能够运行
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
我想删除没有唯一id的列。补充一下,大多数情况下只有一个id(我尝试了in语法,也不起作用)。
这段代码在MySQL 5.0上无法运行,如何改写以使其能够运行
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
我想删除没有唯一id的列。补充一下,大多数情况下只有一个id(我尝试了in语法,也不起作用)。
SELECT
(子)查询返回结果集。因此,在WHERE
子句中需要使用IN
而不是=
。
此外,正如此答案所示,您不能在同一查询内从子查询中修改相同的表。但是,您可以分别使用SELECT
和DELETE
进行操作,或者嵌套另一个子查询并为内部子查询结果设置别名(看起来有点像hacky):
DELETE FROM posts WHERE id IN (
SELECT * FROM (
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
) AS p
)
DELETE
p1
FROM posts AS p1
CROSS JOIN (
SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
CROSS JOIN
显然执行笛卡尔积,因此似乎可能会做一些不必要的工作或表现不佳?有人能解释一下吗? - wintronDELETE p1 FROM posts AS p1 INNER JOIN (SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1) AS p2 ON p2.ID=p1.ID
。 - Cave JohnsonCROSS JOIN
在 MySQL 中与 [INNER] JOIN
相同;它不是按照 ANSI SQL 描述的方式实现 CROSS JOIN
。SELECT ... FROM a JOIN b USING (x)
是 SELECT ... FROM a JOIN b ON b.x = a.x
的语法糖。 - Jivan Pal你可以使用内连接:
DELETE
ps
FROM
posts ps INNER JOIN
(SELECT
distinct id
FROM
posts
GROUP BY id
HAVING COUNT(id) > 1 ) dubids on dubids.id = ps.id
如果你想删除所有重复项,但保留每个重复组中的一个,这是一个解决方案:
DELETE posts
FROM posts
LEFT JOIN (
SELECT id
FROM posts
GROUP BY id
HAVING COUNT(id) = 1
UNION
SELECT id
FROM posts
GROUP BY id
HAVING COUNT(id) != 1
) AS duplicate USING (id)
WHERE duplicate.id IS NULL;
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
- havvg