在电子商务网站中,我必须更改查询。
根据客户选择的数量,本网站的每种产品都有多种价格。
如果购物车中的产品数量超过特定数量,其成本会降低。
例如,如果数量为1,则价格为10美元,如果数量为20,则每种产品的价格将降至8美元。
这是我的表结构:
prices
id | product_id | num | price
1 | 111111 | 1 | 10
2 | 111111 | 20 | 8
3 | 111111 | 100 | 5
4 | 222222 | 1 | 42
5 | 222222 | 50 | 35
cart
id | factor_id | product_id | quantity
1 | 1 | 111111 | 30
2 | 1 | 222222 | 3
3 | 2 | 222222 | 1
4 | 2 | 111111 | 2
在此查询中:
SELECT prices.price AS price, prices.product_id AS product_id FROM cart
LEFT JOIN prices ON prices.product_id = cart.product_id
WHERE prices.num='1'
AND cart.id='$cart_id'
我想更改WHERE prices.num='1'
行。必须根据购物车中的产品数量选择价格。
我认为这样的事情会有所帮助,但我不知道如何使用它,因为每辆车都有各种产品:
SELECT (prices.num - cart.quantity) as nearest, prices.num as priceForThatQuantity
FROM prices
WHERE nearest > 0
ORDER BY nearest ASC
LIMIT 1
然后:
WHERE prices.num='1' = priceForThatQuantity
我想我必须使用某种JOIN ......
编辑:
如果数量少于20,则产品111111
为10美元,20到100之间的数量为8美元,超过100件时为5美元。
答案 0 :(得分:1)
从这个查询开始:
SELECT *
FROM cart c
JOIN prices p
ON c.product_id = p.product_id
AND c.quantity >= p.num
正如您所看到的产品111111
30> 1和30也是> 20所以你需要对这些进行分组并获得最低价格以获得8美元
SELECT c.product_id,
c.quantity,
MIN(p.price) as price
FROM cart c
JOIN prices p
ON c.product_id = p.product_id
AND c.quantity >= p.num
GROUP BY c.product_id,
c.quantity
答案 1 :(得分:1)
唯一标识cart
中某行的内容是什么? (id,product_id)
?
一个选项是具有GROUP BY和MIN()聚合的JOIN,以从cart
中的匹配行中选出最低价格。但是如果cart
中的行没有一定的保证唯一性,我就会在查询时添加GROUP BY
而存在折叠行的风险。
所以更安全的赌注是SELECT列表中的相关子查询。 (对于大型集合来说,这不是最佳选择,但鉴于示例查询正在检索单个购物车,并且购物车中可能存在相当少量的商品,并且在price
表格上提供了合适的索引,这会赢得“在性能方面对我们的伤害太大了,就像在大型场景中一样。
我们可以这样做:
SELECT ( SELECT price.unit_price
FROM price
WHERE price.product_id = cart.product_id
AND price.num <= cart.quantity
ORDER BY price.num DESC
LIMIT 1
) AS unit_price
, cart.product_id AS product_id
FROM cart
WHERE cart.id = 'foo'
请注意,price
表中可能会有多行匹配,如果购物车的数量为“20”,我们可以将price
中的行与num
值匹配15
,12
,6
,3
,1
......所以我们需要一种方法来“挑选”使用哪些行。一种方法是按num
降序排列匹配的行,并仅采用第一行。这就是上面的查询正在做的事情,子查询中的ORDER BY和LIMIT 1。
返回JOIN选项...
除非确保price
中的行的num
值与quantity
的每个可能值匹配,否则我们可能需要查找具有{{}的价格行{1}}小于或等于num
的值。
在JOIN中使用该条件,可能会匹配多行。以下查询有可能从quantity
返回重复的product_id
,这不会返回“正确”的结果,但会演示cart
时我们通过JOIN操作获得的结果“匹配”quantity
...
num
我们可以使用SELECT cart.product_id
, price.num
, price.unit_price
FROM cart
JOIN price
ON price.product_id = cart.product_id
AND price.num <= cart.quantity
WHERE cart.id = 'foo'
ORDER BY 1,2,3
折叠行并使用聚合函数来选择最低价格。 (假设较大的数量产生较低的价格。假设单位价格从不低于较小的数量,我们可以得到我们匹配的GROUP BY
的最高值以及num
的最低值< / p>
price
答案 2 :(得分:0)
尝试:
SELECT prices.price AS price, prices.product_id AS product_id FROM cart
LEFT JOIN prices ON prices.product_id = cart.product_id
WHERE prices.num in ( SELECT quantity FROM cart WHERE cart.id='$cart_id')
AND cart.id='$cart_id'