代码之家  ›  专栏  ›  技术社区  ›  MrSoundless

从数据库获取产品

  •  1
  • MrSoundless  · 技术社区  · 14 年前

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

    virtuemart有一个名为“vm”(虚拟机)产品的表,另一个名为“vm”(虚拟机)产品价格的表。

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

    表格如下:

    /* #__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中没有price行。

    2 回复  |  直到 14 年前
        1
  •  1
  •   D'Arcy Rittich    14 年前

    更新:

    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 
    
        2
  •  1
  •   dcp    14 年前

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