1

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に価格行がありません。

4

2 に答える 2

1

明細書を使用CASEして子の製品価格を確認し、null の場合は親価格を使用できます。

また、親を取得するには別の結合が必要です。

    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
于 2010-08-05T14:21:15.467 に答える
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 
于 2010-08-05T14:37:45.987 に答える