22

私はこれらの2つのクエリをツイストPythonで組み合わせようとしています:

SELECT * FROM table WHERE group_id = 1013 and time > 100;

と:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100

単一のクエリに。そうすることは可能ですか?

SELECTをサブクエリに入れてみましたが、クエリ全体で必要なものが返されるとは思いません。

これを行う方法はありますか?(さらに良いことに、サブクエリなしで)それとも2つのクエリに固執する必要がありますか?

ありがとうございました、

クアン

4

6 に答える 6

9

どうやらmysqlには、特に1行だけを更新する場合に役立つ可能性のあるものがあります。

この例は次のとおりです:http://lists.mysql.com/mysql/219882

UPDATE mytable SET
mycolumn = @mycolumn := mycolumn + 1
WHERE mykey = 'dante';

SELECT @mycolumn;

私はこれを試したことがありませんが、どうやって乗るか教えてください。

于 2012-07-13T20:09:32.737 に答える
6

これは本当にパーティーに遅れていますが、私はこれと同じ問題を抱えていました、そして私が最も役立つと思った解決策は次のとおりでした:

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;

https://gist.github.com/PieterScheffers/189cad9510d304118c33135965e9cddbから

于 2019-03-09T13:01:04.263 に答える
4

これらのクエリを直接組み合わせることはできません。ただし、両方のクエリを実行するストアドプロシージャを作成できます。例:

delimiter |
create procedure upd_select(IN group INT, IN time INT)
begin
    UPDATE table SET time = 0 WHERE group_id = @group and time > @time;
    SELECT * FROM table WHERE group_id = @group and time > @time;
end;
|
delimiter ;
于 2012-07-13T20:10:08.023 に答える
3

したがって、行にアクセスするたびにゼロにリセットしようとしています。timeトリガーのようなものですが、MySQLは。の後にトリガーを実行できませんSELECT

おそらく、アプリからの1つのサーバー要求でそれを行う最良の方法は、行を更新して返すストアドプロシージャを作成することです。2つを同時に発生させることが非常に重要な場合は、2つのステートメントをトランザクションでラップします。

于 2012-07-13T20:19:46.020 に答える
0

更新された行の戻りのより高速なバージョンがあり、高負荷のシステムを処理するときに同じデータベースサーバーで同時にクエリの実行を要求する場合はより正確になります

update table_name WITH (UPDLOCK, READPAST)
SET state = 1
OUTPUT inserted.
于 2014-12-24T08:22:52.097 に答える
-4

UPDATE tab SET column=value RETURNING column1,column2...

于 2019-04-18T23:23:23.680 に答える