Условный подзапрос в операторе SELECT - PullRequest
2 голосов
/ 14 ноября 2010

Я пытаюсь добиться следующего здесь.

У меня есть 3 стола:

  1. блоки
  2. товар
  3. ингредиенты

Я запрашиваю ингредиенты и, в зависимости от результата, хочу выполнить подзапрос или объединить некоторые столбцы из блоков или элементов.

Мне удалось условно выделить 1 столбец (name) в моем операторе выбора, но если я хочу выбрать больше одного столбца, например, SELECT name, material_id, я получаю следующую ошибку:

Для одного допускается только один результат SELECT, являющийся частью выражения

Я видел много подобных случаев здесь на 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"

Поскольку выбор нескольких столбцов в подвыборке не поддерживается, каков будет правильный способ достижения этого?

1 Ответ

3 голосов
/ 14 ноября 2010

Я бы сделал это в соответствии с этим, чтобы избежать повторяющихся коррелированных подзапросов:

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"
...