22

我试图在扭曲的 python 中结合这两个查询:

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

和:

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

到单个查询中。有可能这样做吗?

我尝试将 SELECT 放在子查询中,但我认为整个查询不会返回我想要的。

有没有办法做到这一点?(更好,没有子查询)或者我只需要坚持两个查询?

谢谢你,

4

6 回答 6

9

显然 mysql 确实有一些可能有用的东西,特别是如果你只更新一行。

这个例子来自: 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.

使用来自应用程序的一个服务器请求执行此操作的最佳方法可能是编写一个更新然后返回该行的存储过程。如果让两者一起发生非常重要,请将这两个语句包装在一个事务中。

于 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 回答