从SQL查询获取产品

从SQL查询获取产品,sql,mysql,Sql,Mysql,我目前正在开发一个专有的购物车系统,在以正确的价格购买产品时遇到了一些问题 我的表结构基本如下: 产品表:仅表示相关列 ---------------------------------------------------- productid | product | descr | disporder| list_price| ---------------------------------------------------- 1 name desc

我目前正在开发一个专有的购物车系统,在以正确的价格购买产品时遇到了一些问题

我的表结构基本如下:

产品表:仅表示相关列

----------------------------------------------------
productid | product | descr | disporder| list_price|
----------------------------------------------------
    1        name      desc      1          0.00
    2        name      desc      4          0.00
    3        name      desc      2          2.45
定价表:

变量表:

因此,每种产品都可以有——而且在大多数情况下确实有——多个变体。到目前为止,我已设法创建的当前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

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

最简单的方法是在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应该可靠地为空


希望这就是您绕过变量表的意思:

最简单的方法是在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应该可靠地为空


希望这就是您绕过变量表的意思:

您可以使用variants表进行完全联接,该表将只提供具有变体的产品,然后在不存在varian的情况下,将其与producs和pricing的联接进行联合,使用和不存在varian,从p.productid=v.productid和p.variantid=v.variantid的变体中选择1


否则,请使用定价用例。price

您可以使用variants表进行完全联接,该表将只提供具有变量的产品,然后将其与不存在varianan using且不存在varianan的producs和pricing联接,从p.productid=v.productid和p.variantid=v.variantid的变量中选择1


否则,请使用定价用例。价格是,用例是一个选项,或者:


只需将两个价格相加,当第一个为空时,将选择另一个。

是,大小写是一个选项,或者:

只需将两个价格相加,当第一个为空时,将选择另一个

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