2010-11-14 142 views
2

我试图在此处实现以下内容。SELECT语句中的条件子查询

我有3个表:

  1. 项目
  2. 成分

我查询成分和根据结果,我想子查询或从加入一些列块或项目。

我在我的select语句中设法创建了条件子选择1列(name),但如果我想选择多于一列的列,例如SELECT name, material_id,我得到以下错误:

Only a single result allowed for a SELECT that is part of an expression

我在这里看到许多类似的案件在SO,但不能管理得到这个权利。

SELECT 
    `crafting_recipes`.`ingredient_id`, `crafting_recipes`.`ingredient_table`, 
    CASE 
     WHEN 
      `crafting_recipes`.`ingredient_table` = 'blocks' THEN 
       (SELECT `name` FROM `blocks` WHERE `id` = `crafting_recipes`.`ingredient_id`) 
     ELSE 
      (SELECT `name` FROM `items` WHERE `id` = `crafting_recipes`.`ingredient_id`) 
    END 
FROM 
    `crafting_recipes` 
WHERE 
    `crafting_recipes`.`result_id` = 15 AND 
    `crafting_recipes`.`result_table` = "blocks" 

由于在子查询中选择多个列不被支持,因此实现此目的的正确方法是什么?

回答

3

我会做沿着这些路线,以避免重复相关子查询:

SELECT 
    cr.`ingredient_id`, 
    cr.`ingredient_table`, 
    CASE 
    WHEN 
     cr.`ingredient_table` = 'blocks' THEN 
      b.`name` 
    ELSE 
     i.`name` 
    END as `name` 
FROM 
`crafting_recipes` cr 
    LEFT JOIN `blocks` b on b.`id` = cr.`ingredient_id` 
    LEFT JOIN `items` i on i.`id` = cr.`ingredient_id` 
WHERE 
    cr.`result_id` = 15 AND 
    cr.`result_table` = "blocks" 
+0

你可能需要外连接在这里。 – 2010-11-14 15:59:02

+0

您的方法可以工作,并且更干净,但不允许出现多个结果。你有解决方案吗?谢谢 – richard 2010-11-14 16:08:44

+0

你是什么意思“多个结果”? select子句中的子选择只允许返回恰好一个值。此方法正常工作,因为如果多于一行匹配外部联接,则会得到多于一行的结果。 – Donnie 2010-11-14 16:29:43