我有一个带有两个字段sesskey(varchar32,index)和products(int11)的表,现在我必须通过sesskey count(*)= 1删除所有具有group的行。 我正在尝试一些方法,但都失败了。
示例:
delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1)
sesskey字段不能是主键,因为它重复了。
答案 0 :(得分:9)
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
你需要在这里加入。使用相关子查询将无效。
有关详细信息,请参阅我的博客中的这篇文章:
答案 1 :(得分:1)
SubQuery应该可以工作
Delete from taged
Where sesskey in
(Select sesskey
From taged
Group by sesskey
Having count(*) = 1)
编辑:感谢下面的@Quassnoi评论......上面的 NOT 在MySql中工作,因为MySql限制引用正在更新或删除的表,在子查询我必须使用Join ...
做同样的事情答案 2 :(得分:1)
或者,如果您使用较旧的(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
的表格,其中包含您删除的所有行的历史记录。您可以将其用于存档,趋势,其他有趣和不寻常的事情,让您大吃一惊。