2010-11-14 173 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