3

次のクエリがあります。

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 を検索し、次にそのユーザーの有効期限が切れていないゲームを検索します。
  2. 変更されたゲーム ステージを返します (:i の値に応じて、増加、減少、または変更なしで残されます)。
  3. 外部 SELECT は、辞書から見つかったステージの一意のスクリプトを返します。

明らかに、ゲームが進化したため、変更されたステージ番号 (g.stage + :i) が DB に書き戻されます。に置き換えSELECT scriptSELECT script, g.stage + :i、変更した番号を別の ( UPDATE) クエリで使用できますが、単一のクエリ内で同じことができるでしょうか?

私の DBMS は mySQL 5.5 です。

よろしく、

4

3 に答える 3

1

UPDATE クエリでのみ更新できます。UPDATE クエリは、影響を受ける行の数のみを返すことができます。そのため、単一のクエリで必要な値を更新して選択することはできません。

したがって、追加の UPDATE クエリを使用してデータを更新する必要があります。単純さ、または新しい値がコミットされるはずのコード内の実際のポイントに応じて、SELECT クエリの前後に実行できます。

于 2012-08-11T23:31:06.627 に答える
0

mysql に対する単一のクエリ ソリューションはありません。ただし、データベースがエンジンとして innodb を使用している場合は、試すことができます

select ... for update

行をロックしてから更新します。詳細については、mysql のマニュアル「14.3.9.3. SELECT ... FOR UPDATE および SELECT ... LOCK IN SHARE MODE Locking Reads」を確認してください。

于 2014-03-03T06:43:38.060 に答える
0

私は、1つの方法しかないと思います:

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
于 2012-08-19T11:44:17.893 に答える