Group BY子查询返回多行

时间:2013-01-26 14:09:41

标签: mysql sql sql-update

首先是我的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 ;

我得到Subquery返回超过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

提前致谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

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

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

的where子句

如果你要做的只是将cntr_limit更新为所有客户的全流量+ 322122547200,那么您的查询就可以了,并且会立即使用各自的总数更新所有客户。

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

进行过滤

答案 2 :(得分:0)

如何使用相关子查询进行连接更新:

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
;