5

次のような結果を返すクエリがあります

id | productid | userid | coinsid
1  | 2         | 2      |  5     
3  | 2         | 2      |  6      
4  | 2         | 3      |  7
5  | 2         | 4      |  8
6  | 2         | 3      |  9

これは特定の結果ですproductiduser table上記の結果のすべてのユーザーに $1 を追加して残高を更新するuserid必要がありますが、2 倍の場合は、その特定のユーザーの残高に $1 を 2 回追加する必要があります。したがって、上記の場合、$1 がuserid=2残高とuserid=3残高に 2 回追加されます。

簡単な方法は、すべての個別のレコードをカウントし、useridユーザーがforeachループしている回数だけクエリを実行することです。しかし、私はいくつかの最適化方法を探しています。提案してください。ありがとう

4

4 に答える 4

4

1 つのアプローチ:

UPDATE user_table u
  JOIN ( SELECT q.userid
              , SUM(1.00) AS deposit
           FROM (
                  -- original OP query goes here
                ) q
          GROUP BY q.userid
       ) r
    ON r.userid = u.userid 
   SET u.balance = u.balance + r.deposit

表示された結果セットを返す元の OP クエリを使用し、それをインライン ビューにします (上記のクエリではqとしてエイリアス化されています)。

そこから、ユーザー ID の個別のリストと、そのユーザー ID が結果セットに表示される回数を照会します。これにより、ユーザー名と入金額 (ユーザー ID が表示されるたびに 1 ドル) が得られます (一部のデータベースでは、値が 10 進数であることを確認するために、値を 1 ではなく 1.0 と指定する必要がある場合があります。SUM は、私たちが達成しようとしていること。)

そのインライン ビュー ( r ) をユーザー テーブルに結合し、そのユーザーの現在の残高に預金額を追加します (残高が 10 進数のドル (1.00 = 1 ドル) として格納されていると仮定します)。


テストするには、 をステートメントに変換しUPDATEますSELECT

  • SET" "句を削除
  • " ORDER BY" 句 (オプション) を追加して、結果を決定します
  • " " キーワードを削除してUPDATE置き換えます

と:

 SELECT r.userid
      , r.deposit
      , u.balance             AS old_balance
      , u.balance + r.deposit AS new_balance
      , u.userid
   FROM

全選択:

 SELECT r.userid
      , r.deposit
      , u.balance             AS old_balance
      , u.balance + r.deposit AS new_balance
      , u.userid
   FROM user_table u
  JOIN ( SELECT q.userid
              , SUM(1.00) AS deposit
           FROM (
                  -- original OP query goes here
                ) q
          GROUP BY q.userid
       ) r
    ON r.userid = u.userid

WHERE 句はありません。JOIN 述部 (ON 句内) は、ユーザー テーブルで選択/影響を受ける行を決定するものです。

于 2013-08-16T20:12:31.473 に答える
1

残高テーブルに重複するユーザー ID がないと仮定すると、おそらく次のようなものが機能します。

update balance_table set balance_table.balance = (select count(*) from users_table where users_table.user_id = balance_table.user_id) * 1;

私はplsqlに精通しているので、mysqlデータベースに対してこのクエリを試したことはありませんが、このようなものは機能しませんか?

于 2013-08-16T20:03:57.530 に答える
1

他の回答の相関サブクエリは機能しますが、通常は INNER JOIN の方が効率的です。このようなことを試してください。もちろん、テーブルと列の名前を指定する必要があります。

UPDATE myTable
INNER JOIN (
  SELECT userid, count(*) AS AmountToAdd
  FROM users
  GROUP BY userid
) UserCounts ON myTable.userid = UserCounts.userid
SET balance = balance + UserCounts.AmountToAdd
于 2013-08-16T20:08:11.263 に答える
0
select count(*), userid from yourTable group by userid

私があなたの質問を理解していれば。

于 2013-08-16T20:03:44.033 に答える