首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据库获取产品

从数据库获取产品
EN

Stack Overflow用户
提问于 2010-08-05 22:17:44
回答 2查看 3.2K关注 0票数 1

我正在尝试用一个查询从数据库中获取所有产品。我被价格部分卡住了:

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

如果产品有父产品,这意味着产品继承了父产品的所有内容,除非在子产品中设置了不同的值。

这些表格如下所示:

代码语言:javascript
复制
/* #__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

我执行了下一个查询,获取所有产品及其价格:

代码语言:javascript
复制
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中就没有价格行

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-05 22:37:46

更新:

代码语言:javascript
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2010-08-05 22:21:15

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

此外,您还需要另一个连接来获取父级。

代码语言:javascript
复制
    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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3415580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档