从SQL查询中获取产品

时间:2010-11-25 23:30:39

标签: sql mysql

我目前正在开发一个专有的购物车系统,并且在以正确的价格购买产品方面存在一些问题。

基本上我的表格结构如下:

产品表格(仅表示相关列)

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

然而,当产品没有有变种时,我的问题就出现了。如果产品没有与之关联的变体,则价格将位于list_price表的products列中。我将如何进行检查以确定产品是否确实具有变体。如果没有,它应该有效地绕过variants表并从list_price表中的products获得定价。

3 个答案:

答案 0 :(得分:2)

最简单的方法是在CASE子句中使用SELECT,如下所示:

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 :(得分:2)

是的,CASE是一个选项,或COALESCE

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

只需加入两个价格,当第一个为NULL时,另一个将被选中。

答案 2 :(得分:1)

您可以使用变体表进行完全连接(这只会为您提供具有变体的产品),然后使用产品和定价连接UNION,其中不存在varian(使用AND NOT EXISTS (SELECT 1 from variants WHERE p.productid=v.productid and p.variantid =v.variantid)

否则,请在pricing.price

上使用CASE