我有一个标有两个字段 sesskey (varchar32,索引)和产品(int11)的表,现在我必须删除所有按 sesskey count(*) = 1 分组的行。我正在尝试一些方法,但都失败了。
例子:
delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1)
sesskey 字段不能是主键,因为它重复。
我有一个标有两个字段 sesskey (varchar32,索引)和产品(int11)的表,现在我必须删除所有按 sesskey count(*) = 1 分组的行。我正在尝试一些方法,但都失败了。
例子:
delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1)
sesskey 字段不能是主键,因为它重复。
DELETE si
FROM t_session si
JOIN (
SELECT sesskey
FROM t_session so
GROUP BY
sesskey
HAVING COUNT(*) = 1
) q
ON q.sesskey = si.sesskey
你需要在这里加入。使用相关子查询将不起作用。
有关详细信息,请参阅我的博客中的这篇文章:
子查询应该工作
Delete from taged
Where sesskey in
(Select sesskey
From taged
Group by sesskey
Having count(*) = 1)
编辑:感谢下面的@Quassnoi 评论...以上内容在 MySql 中不起作用,因为 MySql 限制引用正在更新或删除的表,在子查询中我必须使用 Join 做同样的事情...
或者,如果您使用的是较旧(4.1 之前)版本的 MySQL,并且无法访问子查询,则需要将数据选择到表中,然后将该表与原始表连接:
CREATE TABLE delete_me_table (sesskey varchar32, cur_total int);
INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table
WHERE cur_total = 1 GROUP BY sesskey;
DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey);
现在您有一个名为的表,delete_me_table
其中包含您删除的所有行的历史记录。您可以将其用于存档、趋势、其他有趣和不寻常的事情,让自己大吃一惊。