0

首先我是 mysql noob :D 我试过搜索,但没有任何帮助。我试图用这个查询更新我的数据库。

UPDATE client SET cntr_limit=(SELECT fulltraffic from 
(SELECT
    client.id,
    (SUM(ipacct.byteso)+SUM(ipacct.bytesi)) as fulltraffic
        FROM client 
            LEFT JOIN ips ON client.id = ips.cid
            LEFT JOIN ipacct ON ips.ip = ipacct.target
            WHERE ipacct.tag = 1
        GROUP BY client.id
     ) as x
) +322122547200 ;

我得到子查询返回超过 1 行。我知道子查询不能超过一行,但我需要使用 GROUP BY。如果我删除 GROUP BY 查询有效,但每个客户端都获得从所有 ips 计算的流量,而不是为每个 id 计算不同的流量。

如果我使用。

 SELECT
    client.id,
    (SUM(ipacct.byteso)+SUM(ipacct.bytesi)) as fulltraffic
        FROM client 
            LEFT JOIN ips ON client.id = ips.cid
            LEFT JOIN ipacct ON ips.ip = ipacct.target
            WHERE ipacct.tag = 1
        GROUP BY client.id;

我越来越

id  fulltraffic
1   5100993724986
3   410550845834
4   790726628007
5   204212941099
6   440290245087
8   587044969960

如果我删除 GROUP BY 我得到

id  fulltraffic
1   487196626849368

提前致谢。

4

3 回答 3

1

使用IN而不是=.

UPDATE client SET cntr_limit IN (SELECT....

并删除最后一个别名+322122547200 ;

UPDATE但更好的方法是在声明中加入表格,

UPDATE  client a
        INNER JOIN
        (
            SELECT  client.id,
                    (SUM(ipacct.byteso)+SUM(ipacct.bytesi)) as fulltraffic
            FROM    client 
                    LEFT JOIN ips 
                        ON client.id = ips.cid
                    LEFT JOIN ipacct ON ips.ip = ipacct.target
            WHERE   ipacct.tag = 1
            GROUP   BY client.id
        ) b ON a.id = b.id
SET     a.cntr_limit = b.fulltraffic
于 2013-01-26T14:14:27.153 回答
0

How about a join update with a correlated subquery:

SQLFIDDLE DEMO

UPDATE client c
INNER JOIN
(SELECT a.id as id,
 (SUM(ipact.byteso) + SUM(ipact.bytesi)) as ft
 FROM client a
 LEFT JOIN ips ON a.id = ips.cid
 LEFT JOIN ipact ON ips.id = ipact.ipp
            WHERE ipact.tag = 1
        GROUP BY a.id
     ) x
on c.id = x.id
SET c.climit = x.ft
;
于 2013-01-26T14:45:50.683 回答
0

如果我删除 GROUP BY 查询有效,但每个客户端都获得从所有 ips 计算的流量,而不是为每个 id 计算不同的流量。

是的,这正是您想要的。如果您只想要一行,那么您缺少的是指定 client.id 的 where 子句

如果您要做的只是更新cntr_limit为所有客户端的 fulltraffic + 322122547200,那么您的查询很好,并且会立即更新所有客户端及其各自的总数。

如果您一次处理一个客户端,则需要按 client.id 过滤

于 2013-01-26T14:23:59.710 回答