MySQL删除语句基于具有多个返回值的子选择 [英] MySQL delete statement based on sub-select with multiple return values

查看:45
本文介绍了MySQL删除语句基于具有多个返回值的子选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于多返回值的子选择的MySQL删除语句.

MySQL delete statement based on sub-select with multiple return values.

这是我现在正在做的:

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 地址:

This works great, but I would like to select the individual IP addresses dynamically like so:

SELECT peerhost FROM `dnsstats` GROUP BY peerhost;

..并根据这些返回值删除.

..and delete based on those returned values.

这是我尝试过的(但失败了):

This is what i tried (and failed):

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

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

Any idea what I can do to make this work? Thanks!

推荐答案

我认为您可能需要删除SELECT peerhost FROM dnsstats GROUP BY peerhost;

I think you might need to remove the semicolon in SELECT peerhost FROM dnsstats GROUP BY peerhost;

查询将运行,但我认为您不会得到正确的结果:早些时候,您从与对等主机相关的每个 id 中获得 500,

The query will run but I don't think you'll get the correct result: Earlier you were getting 500 from each id related to a peerhost,

现在您将总共获得 500 个.您需要更改查询.

now you'll be getting total 500 for all. You need to change the query.

==> 试试这个布莱恩

==> Try this Bryan

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

这篇关于MySQL删除语句基于具有多个返回值的子选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆