J'essaie de sélectionner un ensemble de résultats différents pour un produit en fonction d'un type de produit. Donc, si mon produit devrait être un livre, je souhaite qu'il recherchera l'UPC et l'artiste pour un produit normal, ces détails sont toutefois désactivés 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
4 Réponses :
Pour un démarrage, le premier SELECT compte 6 colonnes et la seconde dispose de 4 colonnes. Peut-être faire les deux avoir le même nombre de colonnes (ajoutant des nulls?). P>
Vous pouvez essayer l'autre format pour l'instruction de cas voir http://msdn.microsoft.com/en-us/library/ms181765.aspx Pour plus d'informations. P> P>
C'est vraiment mauvais pour la performance. Vous devez plutôt utiliser une jointure, sinon chaque fois que cette requête fonctionne, elle ferait une autre sélection pour chaque ligne. Très cher. S'il vous plaît voir la solution alternative ci-dessous.
J'ai fini par laisser les propriétés communes des requêtes SELECT et effectuez une seconde requête de sélection ultérieure sur la page. J'ai utilisé une commande PHP si commande pour appeler pour différents scripts en fonction de la première requête SELECT, les scripts contenaient la deuxième requête SELECT. p>
Vous devez éviter d'utiliser des sélectionnées imbriquées et j'irais aussi loin que vous ne devez jamais les utiliser dans la partie sélectionnée de votre relevé. Vous allez exécuter ce choix pour chaque ligne renvoyée. C'est une opération très coûteuse. Utilisez plutôt des jointures. Il est beaucoup plus lisible et la performance est bien meilleure.
Dans votre cas, la requête ci-dessous devrait aider. Notez que la déclaration des cas est toujours là, mais maintenant, il s'agit d'une simple opération de comparaison. P>
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
Mettre le SQL dans violon - sqlfiddle.com