2013-05-03 47 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