2010-08-05 6 views
1

J'essaie d'obtenir tous les produits de la base de données avec une seule requête. Je suis bloqué à la partie prix:Obtenir des produits de la base de données

VirtueMart a une table appelée #__vm_product et une autre appelée #__vm_product_price.

Si un produit a un produit parent, cela signifie que le produit hérite de tout du parent sauf s'il est différent dans l'enfant.

Les tableaux ressemblent à ceci:

/* #__vm_product PARTIAL */ 
int - product_id 
int - product_parent_id 
varchar - product_name 

/* #__vm_product_price PARTIAL */ 
int - product_id 
decimal - product_price 
int - mdate 

J'ai fait la prochaine requête qui obtient tous les produits avec leur prix:

SELECT 
p.product_id AS id, 
product_name AS name, 
product_price AS price, 
p.product_parent_id AS parent, 
MAX(pp.mdate) AS last_updated 

FROM jos_vm_product p 
LEFT JOIN jos_vm_product_price pp ON p.product_id = pp.product_id 

GROUP BY p.product_id 
ORDER BY p.product_id 

Le problème avec cette requête est qu'il ne vérifie pas si leur est un prix spécifié. Donc, si c'est un produit pour enfant et qu'il n'a pas de prix, il devrait indiquer le prix de son parent.

Quelqu'un pourrait m'aider avec ça?

Note: Si quelqu'un connaît un moyen plus facile d'obtenir tous les produits (avec prix) de la base de données VirtueMart, s'il vous plaît ne me dérange pas de me dire :)

EDIT: Le prix est jamais nul. Si l'enfant est supposé hériter de son parent, il n'a tout simplement pas de ligne de prix dans jos_vm_product_price

Répondre

1

Mise à jour:

select 
    p.product_id AS id, 
    p.product_name AS name, 
    coalesce(pp.product_price, pp2.product_price) AS price, 
    p.product_parent_id AS parent, 
    coalesce(pp.mdate, pp2.mdate) AS last_updated 
from jos_vm_product p 
left outer join jos_vm_product p2 on p.product_parent_id = p2.product_id 
left outer join (
    select product_id, max(mdate) as maxmdate 
    from jos_vm_product_price 
    group by product_id 
) ppm on p.product_id = ppm.product_id 
left outer join jos_vm_product_price pp on ppm.product_id = pp.product_id and ppm.maxmdate = pp.mdate 
left outer join (
    select product_id, max(mdate) as maxmdate 
    from jos_vm_product_price 
    group by product_id 
) ppm2 on p2.product_id = ppm2.product_id 
left outer join jos_vm_product_price pp2 on ppm2.product_id = pp2.product_id and ppm2.maxmdate = pp2.mdate 
+0

Je ne sais pas comment résoudre cette requête. Il n'utilise pas non plus jos_vm_product_price ce qui rend difficile pour moi de savoir lequel est supposé être le tableau des prix. – MrSoundless

+0

Désolé, cela ne renvoie que les produits pour enfants. Lisez aussi la note EDIT dans le post principal car j'ai fait une "petite" erreur dans mon explication. – MrSoundless

+0

Voir ma mise à jour. J'ai supposé de votre texte précédent que tous les produits que vous vouliez avaient des parents. – RedFilter

1

Vous pouvez utiliser une instruction CASE pour vérifier le prix du produit pour l'enfant et s'il est nul, utilisez le prix parent.

De plus, vous avez besoin d'une autre jointure pour obtenir le parent.

SELECT 
     p.product_id AS id, 
     product_name AS name, 
     CASE 
      WHEN pp.product_price IS NULL then pp2.product_price 
      ELSE pp.product_price 
     END AS price, 
     p.product_parent_id AS parent, 
     MAX(pp.mdate) AS last_updated 

    FROM jos_vm_product p 
    LEFT OUTER JOIN jos_vm_product_price pp 
      ON p.product_id = pp.product_id 
     , jos_vm_product parent 
     , jos_vm_product_price pp2 
    WHERE (p.product_parent_id = parent.product_id OR p.product_parent_id IS NULL) 
    AND (parent.product_id = pp2.product_id OR p.product_parent_id IS NULL) 
    GROUP BY 
     p.product_id, 
     product_name, 
     CASE 
      WHEN pp.product_price IS NULL then pp2.product_price 
      ELSE pp.product_price 
     END, 
     p.product_parent_id 
+0

Cela ne fonctionnera pas parce que PRODUCT_PRICE n'existe pas dans jos_vm_product – MrSoundless

+0

@MrSoundless - Oui, j'ai découvert après avoir regardé de plus près. Vérifiez la dernière modification. Je ne l'ai pas testé, donc il peut y avoir quelques erreurs de syntaxe. – dcp

+0

Merci! Cela a fonctionné après quelques petites corrections (parent_product_id devrait être product_parent_id et p.parent_product_id = 0 au lieu de p.parent_product_id IS NULL). – MrSoundless