向MySQL JOIN查询添加条件:WHERE列等于查询结果

时间:2017-11-29 15:03:18

标签: php mysql e-commerce

在电子商务网站中,我必须更改查询。 根据客户选择的数量,本网站的每种产品都有多种价格。

如果购物车中的产品数量超过特定数量,其成本会降低。

例如,如果数量为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美元。

3 个答案:

答案 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值匹配1512631 ......所以我们需要一种方法来“挑选”使用哪些行。一种方法是按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'