我正在尝试用一个查询从数据库中获取所有产品。我被价格部分卡住了:
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数据库中获取所有产品(含价格)的更简单方法,请不要介意告诉我:)
编辑:价格永远不会为空。如果子级应该从父级继承,那么它在jos_vm_product_price中就没有价格行
发布于 2010-08-05 22:37:46
更新:
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 发布于 2010-08-05 22:21:15
您可以使用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_idhttps://stackoverflow.com/questions/3415580
复制相似问题