2010-08-05 60 views
1

我试图从一个查询中获取数据库中的所有产品。我被卡在价格部分:从数据库中获取产品

VirtueMart有一个名为#__vm_product的表,另一个名为#__vm_product_price。

如果产品具有父级产品,则表示产品会继承父级产品的所有内容,除非它在子级中设置不同。

的表是这样的:

/* #__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 

我做这得到所有产品的价格在下一个查询:

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 

与此查询的问题是,它并不检查他们是一个指定的价格。因此,如果它是一种儿童产品并且没有价格,它应该显示它的父母的价格。

有人可以帮我解决这个问题吗?

注:如果有人知道一个简单的方法来从VirtueMart数据库中获取所有产品(价格),请不要介意告诉我:)

编辑:价格永远不能为null。如果孩子应该从其父母继承,它只是没有在jos_vm_product_price中的价格行

回答

1

更新时间:

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

我不知道如何解决此查询。它也不使用jos_vm_product_price,这让我很难找出哪一个应该是价格表。 – MrSoundless 2010-08-05 14:43:59

+0

对不起,它只返回儿童产品。也请阅读主帖中的编辑说明,因为我在解释中犯了一个“小”错误。 – MrSoundless 2010-08-05 15:12:50

+0

查看我的更新。我从你之前的文章中推断出你想要的所有产品都有父母。 – RedFilter 2010-08-05 15:17:49

1

您可以使用CASE语句来检查孩子的产品价格,如果它为空,则使用父母价格。

另外,您需要另一个连接才能获得父项。

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

因为PRODUCT_PRICE不存在jos_vm_product – MrSoundless 2010-08-05 14:23:43

+0

@MrSoundless这是行不通的 - 是的,我发现,仔细一看后。检查最新的编辑。我没有测试过,所以可能会有一些语法错误。 – dcp 2010-08-05 14:28:27

+0

谢谢!这在一些小的修复(parent_product_id应该是product_parent_id和p.parent_product_id = 0而不是p.parent_product_id IS NULL)之后起作用。 – MrSoundless 2010-08-05 14:46:48