3

我有以下查询:

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_damagetype0,从spells_weaken提供中选择所有内容type为 1。

我也想选择一切def_spell

有人可以解决查询吗?我以前从未使用过这样的案例,也不知道如何使用。

4

2 回答 2

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;
于 2012-06-08T03:16:42.963 回答
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;
于 2012-06-08T03:13:05.280 回答