基于具有多个返回值的子选择的MySQL删除语句。
以下是我现在正在做的事情:
DELETE FROM `dnsstats` WHERE id NOT IN
(
SELECT id FROM
(
SELECT id FROM `dnsstats` WHERE peerhost = 'x.x.x.243' ORDER BY id DESC LIMIT 500
) foo
)
AND id NOT IN
(
SELECT id FROM
(
SELECT id FROM `dnsstats` WHERE peerhost = 'x.x.x.40' ORDER BY id DESC LIMIT 500
) foo2
)
AND id NOT IN
(
SELECT id FROM
(
SELECT id FROM `dnsstats` WHERE peerhost = 'x.x.x.50' ORDER BY id DESC LIMIT 500
) foo3
);
这很好用,但我想动态选择各个IP地址:
SELECT peerhost FROM `dnsstats` GROUP BY peerhost;
..并根据返回的值删除。
这是我尝试过的(并且失败了):
DELETE FROM `dnsstats` WHERE id NOT IN
(
SELECT id FROM
(
SELECT id FROM `dnsstats` WHERE peerhost = (
SELECT peerhost FROM `dnsstats` GROUP BY peerhost;
) ORDER BY id DESC LIMIT 500
) foo
);
知道我能做些什么来使这项工作?谢谢!
答案 0 :(得分:2)
我认为您可能需要删除分号
SELECT peerhost FROM dnsstats
GROUP BY peerhost;
查询将运行,但我认为您不会得到正确的结果: 早些时候,你从每个与peerhost相关的id中得到500,
现在你将获得所有人的500分。您需要更改查询。
==>编辑:试试这个布莱恩
DELETE FROM dnsstats WHERE id IN
(
SELECT e.id FROM
(
SELECT d.id FROM dnsstats d
LEFT JOIN
(
SELECT a.peerhost,
(SELECT id FROM dnsstats WHERE peerhost = a.peerhost
ORDER BY id DESC LIMIT 499,1) id
FROM
(SELECT peerhost FROM dnsstats GROUP BY peerhost) a
) c
ON d.peerhost = c.peerhost
WHERE d.id < c.id) e);
答案 1 :(得分:1)
这就是你想要的?
DELETE FROM `dnsstats` WHERE id NOT IN
(
SELECT id FROM
(
SELECT id FROM `dnsstats` WHERE peerhost in (
SELECT peerhost FROM `dnsstats` GROUP BY peerhost;
) ORDER BY id DESC LIMIT 500
) foo
);