我有以下查询:
SELECT script FROM d_stages WHERE id IN
(SELECT g.stage + :i FROM games g INNER JOIN sessions s ON
g.expired = 0 AND s.user = g.user AND s.token = :token)
显然,修改后的舞台编号(g.stage +:i)应该写回DB,因为游戏已经发展。我可以将SELECT script
替换为SELECT script, g.stage + :i
,并在另一个(UPDATE
)查询中使用修改后的数字,但也许我可以在一个查询中执行相同操作?
我的DBMS是mySQL 5.5。
此致
答案 0 :(得分:1)
您只能使用UPDATE查询进行更新。 UPDATE查询只能返回一件事:然后是受影响的行数。因此,您无法在单个查询中更新和选择所需的值。
因此,您必须使用额外的UPDATE查询来更新数据。您可以在SELECT查询之前执行此操作,具体取决于代码中应该提交新值的简单性或实际点。
答案 1 :(得分:0)
我认为,只有一种方法:
CREATE DEFINER=`root`@`localhost` PROCEDURE `goto_stage`(IN `inc` INT, IN `session_token` VARCHAR(64))
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE new_stage INT;
SELECT g.stage + inc INTO new_stage FROM games g INNER JOIN sessions s ON
g.expired = 0 AND s.user = g.user AND s.token = session_token;
UPDATE games SET stage = new_stage;
SELECT script FROM d_stages WHERE id = new_stage;
END
答案 2 :(得分:0)
没有单一的mysql查询解决方案。但是如果你的数据库使用innodb作为引擎,你可以尝试
select ... for update
锁定行,然后对其进行更新。检查mysql手册“14.3.9.3.SELECT ... FOR UPDATE AND SELECT ... LOCK IN SHARE MODE Locking Reads”了解详情。