0

最初のimmysqlnoob: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 ;

サブクエリを取得すると、複数の行が返されます。サブクエリに複数の行を含めることはできませんが、GROUPBYを使用する必要があります。GROUP BYクエリを削除しても機能しますが、すべてのクライアントは、IDごとに異なる方法で計算されたトラフィックではなく、すべてのIPから計算されたトラフィックを取得します。

私が使用する場合。

 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

GROUPBYimを削除した場合

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

相関サブクエリを使用した結合更新はどうですか?

SQLFIDDLEデモ

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クエリを削除しても機能しますが、すべてのクライアントは、IDごとに異なる方法で計算されたトラフィックではなく、すべてのIPから計算されたトラフィックを取得します。

はい、これはまさにあなたが望むものです。行が1つだけ必要な場合に不足しているのは、client.idを指定するwhere句です。

cntr_limitすべてのクライアントのフルトラフィック+322122547200になるように更新するだけの場合、クエリは問題なく、すべてのクライアントをそれぞれの合計で一度に更新します。

一度に1つのクライアントを処理している場合は、client.idでフィルタリングする必要があります

于 2013-01-26T14:23:59.710 に答える