在电子商务网站中,我必须更改查询。
该网站对每种产品有多种价格,具体取决于客户选择的数量。
如果购物车中的商品数量超过一定数量,则其费用会更低。
例如,如果数量为 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 rates.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 美元。
最佳答案
什么唯一标识购物车
中的一行? (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。
返回“加入”选项...
除非保证 price
中的行的 num
值与 quantity
的每个可能值相匹配,否则我们可能需要查看对于价格中 num
值小于或等于 quantity
的行。
通过 JOIN 中的该条件,有可能匹配多行。以下查询有可能从 cart
返回重复的 product_id
,这不会返回“正确”结果,但会演示我们通过 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
的最高值以及 的最低值价格
SELECT cart.product_id
, MAX(price.num)
, MIN(price.unit_price)
FROM cart
JOIN price
ON price.product_id = cart.product_id
AND price.num <= cart.quantity
WHERE cart.id = 'foo'
GROUP BY cart.id, cart.product_id
ORDER BY cart.id, cart.product_id
关于php - 向 MySQL JOIN 查询添加条件 : WHERE a column equals to result of a query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47555826/