2010-08-05 90 views
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中的價格行

回答

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 
+0

我不知道如何解決此查詢。它也不使用jos_vm_product_price,這讓我很難找出哪一個應該是價格表。 – MrSoundless 2010-08-05 14:43:59

+0

對不起,它只返回兒童產品。也請閱讀主帖中的編輯說明,因爲我在解釋中犯了一個「小」錯誤。 – MrSoundless 2010-08-05 15:12:50

+0

查看我的更新。我從你之前的文章中推斷出你想要的所有產品都有父母。 – RedFilter 2010-08-05 15:17:49

1

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

因爲PRODUCT_PRICE不存在jos_vm_product – MrSoundless 2010-08-05 14:23:43

+0

@MrSoundless這是行不通的 - 是的,我發現,仔細一看後。檢查最新的編輯。我沒有測試過,所以可能會有一些語法錯誤。 – dcp 2010-08-05 14:28:27

+0

謝謝!這在一些小的修復(parent_product_id應該是product_parent_id和p.parent_product_id = 0而不是p.parent_product_id IS NULL)之後起作用。 – MrSoundless 2010-08-05 14:46:48

相關問題