选择时的 MySQL CASE

标签 mysql sql

我有以下查询:

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

无论如何,我还想从 def_spell 中选择所有内容。

有人可以修复查询吗?我以前从未使用过这样的案例,也不确定如何使用。

最佳答案

您不能像那样使用 CASE 在两个表的输出之间进行选择。

不幸的是,这很容易;解决 (a) 您正在尝试做的事情以及 (b) 获得同等结果需要更长的时间。

如果您向我们提供有关 Spells_Weaken 和 Spells_Damage 表中的列的信息,事情会更容易。据推测,存在一些差异;否则,您将只有一张 table 。事实上,单个 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;

关于选择时的 MySQL CASE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942562/

相关文章:

php - 在 PHP 中将包含空字节的字符串(PNG 图像)写入 MySQL

java - Spring Boot 应用程序中出现 MySQL 语法错误

sql - T-SQL INSERT INTO 使用 LEFT JOIN

sql - 在插入语句中使用强制转换

sql - 对一组数据进行两个级别的分组。是否可以

sql - 如何减去两个包含 ISO 格式的 dateTime 的 dateTime 字段并得到以小时为单位的结果?

php - 3个日期范围之间的Mysql查询

mysql - 存储可从多个节点访问的大型只读文件的最佳方式

php - 客户端编辑几个页面。迷你内容管理系统?

mysql - 如何对从联合查询收到的值进行独特的计数?