0

これに要約される複雑なクエリがあります。

UPDATE usertable
SET userstatus =
    (SELECT numposts*5 as status FROM
        (SELECT count(*) as numposts FROM poststable WHERE poststable.userid = usertable.userid) as table2
    )
WHERE usertable.userid > 0

これは、すべてのユーザー レコードを更新し、子テーブルの行数に基づいて計算された値にユーザーのステータスを設定するクエリです。

問題は、usertable.userid が第 2 レベルのサブクエリに到達しないことです。

クエリは、次のように 1 レベルだけ下に表示すると機能します。

UPDATE usertable
SET userstatus =
    (SELECT count(*) as numposts FROM poststable WHERE poststable.userid = usertable.userid)
WHERE usertable.userid > 0

問題は、実際の状況での計算クエリが非常に複雑であることです。

問題は、第 2 レベルのサブクエリを取得してトップ レベルのクエリの値を認識する方法はありますか? この例では、usertable.userid を 2 レベル下に認識させる方法はありますか?

ありがとう!-ニコ

4

1 に答える 1

1

行ごとに相関サブクエリを実行する代わりに、すべてのユーザー ID の 1 回限りのサブクエリとして派生テーブルを生成し、それを更新するテーブルに結合します。MySQL は複数テーブルの更新構文をサポートしています。

UPDATE usertable AS u
LEFT OUTER JOIN (
    SELECT userid, COUNT(*) AS numposts
    FROM poststable
    GROUP BY userid
    ORDER BY NULL
) AS t USING (userid)
SET u.userstatus = 5 * COALESCE(t.numposts, 0)
WHERE u.userid > 0

実際のクエリはもっと​​複雑だとおっしゃっていましたが、同じ原則で解決できるかもしれません。

于 2013-10-21T21:11:05.793 に答える