MySQL删除语句基于具有多个返回值的子选择

时间:2016-10-03 22:43:10

标签: mysql subquery

基于具有多个返回值的子选择的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 
);

知道我能做些什么来使这项工作?谢谢!

2 个答案:

答案 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 
);