2011-07-31 10 views
1

少し前@Richard Harris gave a great answer for a similar questionしかし、私の状況は若干異なると思います。MySQL - 異なるSETとWHERE句を持つ2つのクエリを組み合わせる

私が見てきたように、同じテーブルとフィールドをターゲットとし、SETとWHERE句が異なる2つの連続するUPDATE文があります。

$this->db->query(" 
UPDATE user_profiles 
SET reputation = reputation + 15 
WHERE user_id = $answer_author_id; 
"); 

$this->db->query(" 
UPDATE user_profiles 
SET reputation = reputation + 2 
WHERE user_id = $user_id; 
"); 

これを単一のクエリに組み合わせることができるのか、それともさらに正規化する必要があるのだろうかと思います。また、これらの連続するクエリはあまりにも効率が悪いですか?もしそうでなければ、私は単一のクエリに結合しようとするのは気にしないでしょう。

あなたのご意見は大変ありがたいです。

答えて

2

あなたがこれを行うことができます:

UPDATE user_profiles 
SET reputation = reputation + 
      case when user_id = $answer_author_id then 15 
       when user_id = $user_id then 2 
       else 0 
      end 
WHERE user_id = $answer_author_id or user_id = $user_id; 
+0

もう一度@derek;) - このソリューションと2つのクエリのアイデアの再効率化この種の状況をベンチマークしたことがある場合にはちょっと好奇心旺盛です。 – pepe

+0

SSH経由でDBソフトウェアを使用して、クイックベンチマークチェック(コードに対して2つのサーバレスポンスを平均したもの)を行いました。 64.1 ms) - 2つのクエリ(ave。162.6 ms) - かなり印象的ないいえ? – pepe

1

解決策は実際にはthis oneと大きく異なるものではありません。

UPDATE my_table SET reputation = 
    IF(USER_ID = $user_id, REPUTATION + 2, REPUTATION + 15) 
     WHERE USER_ID IN ($user_id, $answer_author_id); 
+0

THX - 私はそれが少し読みやすく(メンテナンス酒用)ですので、私はその間ためのデレクのコードを試してみてくださいと思う – pepe

+0

が自分でスーツを、彼らは同じクエリに煮詰めますどちらにしても。 – cwallenpoole

1

UPDATEは SETの評判=評判をuser_profiles + IF(USER_ID = $ answer_author_id、15,2) WHERE USER_ID = $ answer_author_id ORのuser_id = $ answer_author_id。

これはうまくいきますが、効率が非常に重要でない限り、2つのクエリをコードの読みやすさに使うことをおすすめします。

関連する問題