首先是我的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
提前致谢。
答案 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)
如何使用相关子查询进行连接更新:
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
;