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;

うまくいけば、それは理にかなっています...私は基本的に、提供からのすべてが0であり、提供からのすべてspells_damageが1であることを選択しようとしています.typespells_weakentype

また、関係なくすべてを選択したいと思いますdef_spell

誰かがクエリを修正できますか? 私はこれまでこのようなケースを使用したことがなく、方法がわかりません。

4

2 に答える 2

4

そのような 2 つのテーブルの出力を選択するために CASE を使用することはできません。

残念ながら、それは簡単なことです。(a) やろうとしていること、および (b) 同等の結果を達成するには、もう少し時間がかかります。

Spells_Weaken および Spells_Damage テーブルの列に関する情報を提供していただけると、より簡単になります。おそらく、いくつかの違いがあります。そうしないと、テーブルが 1 つだけになります。確かに、Spells テーブルが 1 つである方が、より優れた設計になる可能性があります。

疑問を脇に置きましょう。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

あなたはそれをすることができなくなります。これを2つのクエリに分割するか、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 に答える