我目前正在开发一个专有的购物车系统,并且在以正确的价格购买产品方面存在一些问题。
基本上我的表格结构如下:
产品表格(仅表示相关列)
----------------------------------------------------
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
获得定价。
答案 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