更新表然后在mySQL中返回更新的行

时间:2012-08-11 22:42:08

标签: mysql select

我有以下查询:

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)
  1. 内部SELECT在给定令牌的'sessions'表中查找用户ID,然后在该用户的未过期游戏中查找用户ID。
  2. 返回游戏阶段,该阶段被修改(递增,递减或保留而不进行修改,具体取决于:i值)。
  3. 外部SELECT从字典中返回找到的阶段的唯一脚本。
  4. 显然,修改后的舞台编号(g.stage +:i)应该写回DB,因为游戏已经发展。我可以将SELECT script替换为SELECT script, g.stage + :i,并在另一个(UPDATE)查询中使用修改后的数字,但也许我可以在一个查询中执行相同操作?

    我的DBMS是mySQL 5.5。

    此致

3 个答案:

答案 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”了解详情。