2013-05-03 65 views
-1

我有此FF表稱爲設備 SELECT CASE:使用基於恆定值

+----------+----------+-----------+-------------+----------+---------+ 
| equip_id | chara_id | weapon_id | headgear_id | armor_id | ring_id | 
+----------+----------+-----------+-------------+----------+---------+ 
|  3 |  1 |   3 |   5 |  9 |  8 | 
|  5 |  3 |   3 |   5 |  3 |  8 | 
|  6 |  4 |   7 |   5 |  3 |  8 | 
|  7 |  5 |   4 |   5 |  3 |  8 | 
|  8 |  6 |   3 |   5 |  2 |  8 | 
|  10 |  8 |   3 |   5 |  2 |  8 | 
+----------+----------+-----------+-------------+----------+---------+ 

,我有這麼長的case語句:

switch ($equip->item_type) { 
     case '1': 
      # Weapon 

      $sql_equip = "UPDATE equipment SET weapon_id = :item_id WHERE chara_id = :chara_id"; 
      break; 

     case '2': 
      # Armor 
      $sql_equip = "UPDATE equipment SET armor_id = :item_id WHERE chara_id = :chara_id"; 
      break; 

     case '3': 
      # Ring 
      $sql_equip = "UPDATE equipment SET ring_id = :item_id WHERE chara_id = :chara_id"; 
      break; 

     case '4': 
      # Headgear 
      $sql_equip = "UPDATE equipment SET headgear_id = :item_id WHERE chara_id = :chara_id"; 
      break; 

     default: 
      # do nothing... 
      break; 
    } 

我在網上看到一些查詢你可以在你的查詢中使用case語句,我搜索了網絡,我似乎找不到一個正確的使用。

我希望它在1語句中,因爲我將它包裝在一個事務函數中,並且還會添加另一行mysql語句。所以,而不是做4x2(當前)我只會做2(如果這可以在1查詢中完成)mysql查詢。

+0

@PeterLang它已經標準化。 – 2013-05-03 09:17:58

+0

你應該考慮改變你的表模型。既然你已經使用item_type和item_id,爲什麼不用這種風格創建你的表呢?當你的當前模型強制你改變表和代碼,每當一個新的項目類型(鞋,第二個武器,第二環)被添加... – 2013-05-03 09:22:40

+0

@YourCommonSense:好的,改變了我的評論。 – 2013-05-03 09:23:13

回答

1

,你可以有這樣的說法,

UPDATE equipment 
SET  weapon_id = CASE WHEN :itemtype = 1 THEN :item_id ELSE weapon_id END, 
     armor_id = CASE WHEN :itemtype = 2 THEN :item_id ELSE armor_id END, 
     ring_id = CASE WHEN :itemtype = 3 THEN :item_id ELSE ring_id END, 
     headgear_id = CASE WHEN :itemtype = 4 THEN :item_id ELSE headgear_id END 
WHERE chara_id = :chara_id 

,但你需要通過三個值,:itemtype:item_id:chara_id

0
$fieldnames = array(1=>'weapon', 'armor', 'ring', 'headgear'); 
if (isset($fieldnames[$equip->item_type])) { 
    $field = $fieldnames[$equip->item_type].'_id'; 
    $sql_equip = "UPDATE equipment SET $field = :item_id WHERE chara_id = :chara_id"; 
} 
+0

不錯,'PHP'的方式。 – 2013-05-03 09:15:34

+0

我會看着這個@家,但現在生病回家:') – Viscocent 2013-05-03 09:36:21