2011-07-31 72 views
1

前一陣子@Richard Harris gave a great answer for a similar question,但我相信我的情況稍有不同。MySQL - 結合2個查詢有不同的SET和WHERE子句

正如你所看到的,我有2個連續的UPDATE語句針對相同的表和字段,但具有不同的SET和WHERE子句。

$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進行了快速基準檢查(對於代碼與'2查詢'的平均5個服務器響應) - 結果:你的代碼(ave。 64.1毫秒) - 2個查詢(大約162.6毫秒) - 相當令人印象深刻的不是? – 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 user_profiles SET的信譽=聲譽+ IF(USER_ID = $ answer_author_id,15,2) WHERE USER_ID = $ answer_author_id OR USER_ID = $ answer_author_id;

這可行,但我建議只使用2個查詢來代碼可讀性,除非效率是非常重要的。