2016-12-22 2 views
1

MySQLカラムをインクリメントして1つのクエリで結果を得ることは可能ですか?もしそうなら、それは2つのクエリでそれを行うよりも、いかに効率的ですか? versionではなく、の自動インクリメント列です。MySQLカラムをインクリメントして結果を得る

$stmt=$this->pdo->prepare('UPDATE source_clients SET version=version+1 WHERE guid=?'); 
    $stmt->execute([$guid]); 
    $stmt=$this->pdo->prepare('SELECT version FROM source_clients WHERE guid=?'); 
    $stmt->execute([$guid]); 
    $version=$stmt->fetchColumn(); 
+0

2つのクエリを持つ必要はありません –

+0

1つのクエリで行う方法はありません。あなたがそれをやっている方法が最も効率的です。 – DaveyBoy

+0

ありがとうRaymondとDaveyBoy。サブクエリがそうすることができるかどうかは分かりませんでした。 – user1032531

答えて

0

自分で良いラッパーを入手してください。重複したコードを緩和し、1回の呼び出しで2つのクエリと同じようにコードを効果的に作成します。

$this->pdo->run('UPDATE source_clients SET version=version+1 WHERE guid=?',[$guid]); 
$version=$this->pdo->run('SELECT version FROM source_clients WHERE guid=?',[$guid]) 
     ->fetchColumn(); 

上記の方法は、私のsimple PDO wrapper

からである。しかし実際には、あなたはPDOを持つ単一の呼び出しでこれらの2つのクエリを実行することができます。

エミュレーションモードをオンにすると、かなり可能になります。しかし、あなたのコードを短くすることはありません:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 
$sql = 'UPDATE source_clients SET version=version+1 WHERE guid=:guid; 
     SELECT version FROM source_clients WHERE guid=:guid'; 
$stmt=$this->pdo->prepare($sql); 
$stmt->execute(['guid' => $guid]); 
$stmt->nextRowset(); 
$version = $stmt->fetchColumn(); 

私はこのアプローチが問題になるのではないかと疑います。
さらに詳しい情報はこちらPDO tutorial

+0

ありがとうYourCommonSense。トピックから外してはいますが、通常はすべての/ほとんどのクエリに対してこのようなラッパーを使用していますか? – user1032531

+0

もちろんあります。欠点はなく、繰り返されるコードを記述するのは嫌いです。つまり、PDOを使用して作業する必要がある場合は、このラッパーを使用しています。 Btw、私はあなたの質問への文字通りの答えの例を追加しました:) –

関連する問題