我有以下查询:
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
中选择所有内容。
有人可以修复查询吗?我之前从未使用过此类案例,也不确定如何处理。
答案 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;