2012-07-09 1 views
-1

J'ai besoin d'aide pour une vue.Utiliser la sous-requête plusieurs fois

J'ai 2 tables que j'ai besoin de "fusionner" ensemble.

La première table contient des informations sur les produits (product-color-size), et les autres tableaux ont des informations sur les stocks, vendus, avilables (quantity) etc sur product-season-color-size niveau.

J'ai besoin de mon point de vue pour retourner le produit pr disponible. Le même produit-couleur-taille peut être plusieurs fois (Il peut être sur plusieurs saisons), et donc je ne peux pas faire une somme ex disponible.

Ma requête ressemble à ceci

SELECT 
    SUM((
     SELECT 
      SUM(products_details.available) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    )) AS available 
FROM 
    products 

Mais, cela ne fonctionnera pas. Si une taille a 6 dans disponible et un autre a -5, la requête retournera 1 disponible. Mais, j'ai effectivement 6, je peux vendre.

donc je dois faire quelques ajustements

SELECT 
    SUM((
     SELECT 
      SUM(
       IF(
        products_details.available > 0, 
        products_details.available, 
        0 
       ) 
      ) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    )) AS available 
FROM 
    products 

Mais, cela ne fonctionnera pas non. Si la taille a 6 disponibles sur une saison et -5 sur une autre, la requête retournera 6 disponibles. Mais, ces deux lignes j'ai besoin de faire la somme, parce que c'est le même produit. Par conséquent, il doit retourner 1 disponible.

Alors, je suis venu avec

SELECT 
    SUM(
     IF(
      (
       SELECT 
        SUM(
         IF(
          products_details.available > 0, 
          products_details.available, 
          0 
         ) 
        ) 
       FROM 
        products_details 
       WHERE 
        products_details.product_id = products.id 
      ) > 0, 
      (
       SELECT 
        SUM(
         IF(
          products_details.available > 0, 
          products_details.available, 
          0 
         ) 
        ) 
       FROM 
        products_details 
       WHERE 
        products_details.product_id = products.id 
      ), 
      0 
     ) 
    ) AS available 
FROM 
    products 

Mais, ce sera très (!!) lent. Puis-je utiliser en quelque sorte la même sous-requête plusieurs fois? Donc, je peux l'utiliser dans l'instruction If, et si c'est positif, je peux utiliser la même valeur à utiliser dans la somme?

Il est assez complexe, mais j'espère que quelqu'un peut me aider

/Mads

Modifier

Je viens de découvrir que je peux écrire

SELECT 
    SUM((
     SELECT 
      IF(
       SUM(products_details.available) > 0, 
       SUM(products_details.available), 
       0 
      ) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    )) AS available 
FROM 
    products 

Cela pourrait fonctionner bien

Édition2

J'ai trouvé une nouvelle et beaucoup plus rapide pour l'écrire, et il fonctionne très bien :-)

SELECT 
    SUM(GREATEST(0,(
     SELECT 
      SUM(products_details.available) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    ))) AS available 
FROM 
    products 
GROUP BY 
    products.id 

Ceci est très rapide - environ 10 sec juste au-dessus 1 sec.

Répondre

1

Les sous-requêtes ne sont pas le bon outil pour ce travail. En fait, les sous-requêtes sont assez rares dans les requêtes SQL courantes. Ce qui est plus susceptible d'être utile sont JOIN s.

SELECT products.*, SUM(IF(product_details.available > 0, product_details.available, 0)) AS available 
FROM products 
INNER JOIN product_details ON (product_details.product_id = products.id) 
GROUP BY products.id 

Ceci renvoie une ligne pour chaque produit avec la somme de toutes les valeurs availability de ce produit à travers toutes les lignes de products_details.

+0

Cela ne fonctionnera pas. J'ai besoin de SUM à travers les saisons (la taille peut être sur plusieurs saisons, mais j'ai besoin de la valeur SUMmed de celui-ci) ..J'aurais aimé (!) Utiliser join (je les utilise tout le temps), mais parce que j'ai besoin de SUM d'une manière spéciale, je ne peux pas l'utiliser de cette façon – Mads

+0

Ah, j'ai mal lu cette restriction. Comment pouvez-vous identifier quel enregistrement 'product_details' est le bon? Dans votre exemple où l'un a 6 et l'autre a -5, comment puis-je dire que le 6 est le bon? – VoteyDisciple

+0

Si je lis correctement vos échantillons, il s'agit simplement de mettre à zéro les valeurs négatives et de les additionner. J'ai fait cet ajustement à ma requête. – VoteyDisciple

Questions connexes