2010-11-25 95 views
0

我目前正在研究專有的購物車系統,並且遇到了一些使用正確的價格獲取產品的問題。從SQL查詢中獲取產品

基本上我的表結構如下:

產品表:(僅適用列代表)

---------------------------------------------------- 
productid | product | descr | disporder| list_price| 
---------------------------------------------------- 
    1  name  desc  1   0.00 
    2  name  desc  4   0.00 
    3  name  desc  2   2.45 

價格表:

---------------------------------------- 
priceid | productid | price | variantid| 
---------------------------------------- 
    1   1  13.91  1 
    2   2  54.25  4 
    3   2  47.23  2 

變種表:

------------------------------- 
variantid | productid | active| 
------------------------------- 
    1   1   Y  
    2   2   Y 
    3   2   Y 

因此,每個產品都可以具有 - 並且在大多數情況下具有 - 多種變體。我現在的SQL查詢我已成功地創建迄今爲:

SELECT 
     products.productid, product, descr, p.price, i.image_path 
    FROM 
     products 
    LEFT JOIN 
     pricing AS p 
    ON 
     p.variantid = (SELECT variantid FROM variants 
      WHERE productid = products.productid LIMIT 1) 
    LEFT JOIN 
     images_T AS i 
    ON 
     i.id = products.productid 
    GROUP BY 
     products.productid 
    ORDER BY 
     products.disporder 

然而,當一個產品有我的變種出現問題。如果產品沒有與之相關的變體,價格將在products表格的list_price列中。如何執行檢查以確定產品是否確實有變體。如果不是,它應該有效地繞過variants表,並從表中獲得products表中的定價。

回答

2

是,CASE是一個選項,或COALESCE

SELECT 
    products.productid, product, descr, 
    COALESCE(products.list_price, p.price) AS price, 
    i.image_path 
... 

剛剛加入價格及第一是當NULL其他的將被選擇

+0

爲此歡呼:) – 2010-11-26 01:12:39

2

最簡單的方法是SELECT子句中使用CASE,像這樣:

SELECT 
    products.productid, product, descr, 
    CASE 
     WHEN p.price IS NULL 
     THEN products.list_price 
     ELSE p.price 
    END AS price, 
    i.image_path 
[...] 

既然你留下接合部定價/變種,p.price應可靠地爲NULL產品沒有變種。

希望這就是您「繞過」變體表的含義。 :)

1

你可以做變種表(這將只給你這也有變種producs)全加入,然後UNION其與加入producs和定價那裏不存在瓦里安(使用AND NOT EXISTS (SELECT 1 from variants WHERE p.productid=v.productid and p.variantid =v.variantid)

否則,使用CASE上pricing.price