J'essaie de sélectionner un ensemble de résultats différent pour un produit en fonction d'un type de produit. Donc, si mon produit doit être un livre, je veux qu'il recherche le UPC et artiste pour un produit normal, ces détails ne sont cependant pas pertinents et pour un autre produit, je voudrais un ensemble de résultats complètement différent.
SELECT CASE Product.type_id
WHEN 10 THEN (
SELECT
Product.product_id,
Product.type_id,
Product.product_name,
Product.UPC,
Product_Type.type,
CONCAT_WS(' ' , first_name, middle_name, last_name ) AS artistC
FROM Product, Product_Type, Product_ArtistAuthor
WHERE Product.type_id = Product_Type.type_id
AND Product.product_id = $pid
AND Product.artist_id = Product_ArtistAuthor.artist_id
)
ELSE (
SELECT
Product.product_id,
Product.type_id,
Product.product_name,
Product_Type.type
FROM Product, Product_Type
WHERE Product.type_id = Product_Type.type_id
AND Product.product_id = $pid
)
END
FROM Product
WHERE Product.product_id = $pid
Je ne sais pas où je vais mal
Vous pourriez essayer l'autre format pour la déclaration de cas
CASE WHEN Product.type_id = 10
THEN
(
Select Statement
)
ELSE
(
Other select statement
)
END
FROM Product
WHERE Product.product_id = $pid
Voir http://msdn.Microsoft.com/en-us/library/ms181765.aspx pour plus d'informations.
Vous devez éviter d'utiliser des sélections imbriquées et j'irais jusqu'à dire que vous ne devriez jamais les utiliser dans la partie de sélection réelle de votre déclaration. Vous exécuterez cette sélection pour chaque ligne renvoyée. C'est une opération vraiment coûteuse. Utilisez plutôt les jointures. Il est beaucoup plus lisible et les performances sont bien meilleures.
Dans votre cas, la requête ci-dessous devrait vous aider. Notez que l'instruction cases est toujours là, mais maintenant c'est une opération de comparaison simple.
select
p.product_id,
p.type_id,
p.product_name,
p.type,
case p.type_id when 10 then (CONCAT_WS(' ' , first_name, middle_name, last_name )) else (null) end artistC
from
Product p
inner join Product_Type pt on
pt.type_id = p.type_id
left join Product_ArtistAuthor paa on
paa.artist_id = p.artist_id
where
p.product_id = $pid
J'ai utilisé une jointure gauche car je ne connais pas la logique métier.
Pour commencer, la première sélection a 6 colonnes et la seconde a 4 colonnes. Peut-être que les deux ont le même nombre de colonnes (en ajoutant des valeurs nulles?).
J'ai fini par laisser les propriétés communes des requêtes SELECT et faire une deuxième requête SELECT plus tard dans la page. J'ai utilisé une commande php IF pour appeler différents scripts en fonction de la première requête SELECT, les scripts contenaient la deuxième requête SELECT.