SELECT时的MySQL CASE

时间:2012-06-08 03:00:21

标签: mysql sql database mysqli

我有以下查询:

SELECT CASE WHEN `def_spell`.`type` = 0 THEN `spells_damage`.* 
            WHEN `def_spell`.`type` = 1 THEN `spells_weaken`.*
       END 
FROM `def_spell` 
LEFT JOIN `spells_damage` ON `def_spell`.`id` = `spells_damage`.`spell_id` 
LEFT JOIN `spells_weaken` ON `def_spell`.`id` = `spells_weaken`.`spell_id` 
WHERE `def_spell`.`id` = 1;

希望这是有道理的......我基本上试图从提供spells_damage的{​​{1}}中选择的所有内容为0,提供type的{​​{1}}中的所有内容均为1

我也想从spells_weaken中选择所有内容。

有人可以修复查询吗?我之前从未使用过此类案例,也不确定如何处理。

2 个答案:

答案 0 :(得分:4)

您无法使用CASE在两个表的输出之间进行选择。

不幸的是,这很容易;制定出来(a)你要做的事情和(b)取得相同的成果需要更长的时间。

如果您向我们提供有关Spells_Weaken和Spells_Damage表中列的信息,会更容易。据推测,存在一些差异;否则,你会有一张桌子。实际上,单个Spells表可能仍然是更好的设计。

让我们放下怀疑。假设Spells_Weaken和Spells_Damage表与UNION兼容,您可以使用UNION来实现结果:

SELECT s.*, d.*
  FROM def_spell AS s
  LEFT JOIN spells_damage AS d ON s.id = d.spell_id
 WHERE s.type = 0
   AND s.id = 1
UNION
SELECT s.*, w.*
  FROM def_spell AS s
  LEFT JOIN spells_weaken AS w ON s.id = w.spell_id 
 WHERE s.type = 1
   AND s.id = 1;

答案 1 :(得分:3)

你将无法做到这一点。您需要将其拆分为两个查询,或者使用CASE语句手动指定每个列。

SELECT CASE WHEN a.`type` = 0 THEN b.col1 
            WHEN a.`type` = 1 THEN c.col1
       END  AS col1
       , CASE WHEN a.`type` = 0 THEN b.col2
            WHEN a.`type` = 1 THEN c.col2
       END  AS col2
FROM `def_spell`  a
LEFT JOIN `spells_damage` b ON a.`id` = b.`spell_id` 
LEFT JOIN `spells_weaken` c ON a.`id` = c.`spell_id` 
WHERE a.`id` = 1;