2012-08-11 70 views
2

返回更新的行我有以下查詢:更新則表中的MySQL

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. 內心的選擇由給定令牌會在「會話」表中的用戶ID,那麼對非過期該用戶的遊戲。
  2. 它返回遊戲的階段,它被修改(增加,減少或保持不變,取決於:i值)。
  3. Outer SELECT從字典中爲找到的舞臺返回一個唯一的腳本。

很顯然,修改後的階段號(g.stage +:i)應該寫回數據庫,因爲遊戲已經發展了。我可以使用SELECT script, g.stage + :i替換SELECT script,並在另一個(UPDATE)查詢中使用修改後的數字,但也許我可以在單個查詢中執行相同操作?

我的DBMS是mySQL 5.5。

Regards,

回答

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 
1

您只能使用UPDATE查詢進行更新。 UPDATE查詢只能返回一件事情:然後受影響的行數。因此,您無法在單個查詢中更新並選擇所需的值。

因此,您必須使用額外的UPDATE查詢來更新數據。您可以在SELECT查詢之前執行此操作,具體取決於代碼中的簡單性或真實點,代碼中應該提交新值。

0

沒有單一的解決辦法查詢到MySQL。但是,如果你的數據庫使用InnoDB的發動機,你可以嘗試

select ... for update 

鎖定行,然後就更新它。檢查mysql手冊「14.3.9.3。選擇...更新並選擇...鎖定共享模式鎖定讀取」以獲取詳細信息。