2010-11-14 18 views
2

J'essaie de réaliser ce qui suit ici.Sous-requête conditionnelle dans l'instruction SELECT

J'ai 3 tables:

  1. blocs
  2. articles
  3. ingrédients

ingrédients et je fais une recherche en fonction du résultat, je veux rejoindre ou sous-requête des colonnes de des blocs ou des objets.

J'ai réussi à la colonne du sous-menu 1 conditionnel (name) dans mon instruction select, mais si je veux sélectionner plus d'une colonne, par ex. SELECT name, material_id, je reçois l'erreur suivante:

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

Je l'ai vu de nombreux cas similaires ici sur le SO mais ne peut pas réussir à obtenir ce droit.

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" 

Puisque la sélection de plusieurs colonnes dans une sous-sélection n'est pas supportée, quelle serait la bonne façon d'y parvenir?

Répondre

3

je le ferais le long de ces lignes afin d'éviter les sous-requêtes répétées corrélées:

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

Vous avez probablement REJOINT ici OUTER. –

+0

Votre méthode fonctionne et est plus propre mais elle ne permet pas de résultats multiples. Avez-vous une solution pour cela? Merci – richard

+0

Que voulez-vous dire "résultats multiples"? Les sous-sélections de la clause select sont uniquement autorisées à renvoyer exactement une valeur. Cette méthode fonctionne correctement dans le cas où plus d'une ligne correspond à la jointure externe, vous obtenez plus de une ligne en conséquence. – Donnie