【问题标题】:Get Products from database从数据库中获取产品
【发布时间】:2010-08-05 14:17:43
【问题描述】:

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

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 中没有价格行

【问题讨论】:

    标签: mysql joomla virtuemart


    【解决方案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 
    

    【讨论】:

    • 我不确定如何修复此查询。它也没有使用 jos_vm_product_price,这让我很难找出哪个应该是价格表。
    • 对不起,它只返回子产品。另外请阅读主帖中的编辑说明,因为我在解释中犯了一个“小”错误。
    • 查看我的更新。我从你之前的文字中假设你想要的所有产品都有父母。
    • 我仍然得到相同的结果。
    • 已更新,再试一次。
    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 这行不通,因为 jos_vm_product 中不存在 product_price
    • @MrSoundless - 是的,我仔细观察后发现了这一点。检查最新的编辑。我没有测试过,所以可能有一些语法错误。
    • 谢谢!!这在几个小修复后起作用(parent_product_id 应该是 product_parent_id 和 p.parent_product_id = 0 而不是 p.parent_product_id IS NULL)。
    • 我的错误,它似乎不起作用。它不会返回未指定价格的行。原因可能是因为价格永远不会为空。如果应该从其父级继承,则子级的 jos_vm_product_price 中没有行。 (我想我之前应该提到过这个)
    • @MrSoundless - 好的,在这种情况下,您需要使用左外连接,因为可能不存在子价格记录。查看最新编辑并告诉我进展如何。
    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2018-09-30
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多