php - 向 MySQL JOIN 查询添加条件 : WHERE a column equals to result of a query

标签 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 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 中的行num1512631 ...所以我们需要一种方法来“挑选”要使用哪些行。一种方法是按 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/

相关文章:

php - mySql 的输出是二维 Json 但有重复项

php - 如何在 SQL 中管理产品选项和仓库项目之间的关系

PHP:JSON 格式输出到一长单行

php - 如何在 ubuntu 上显示 php 中的错误?

mysql - 在 SQL 中将一列中的一个值与另一列中的多个值进行匹配

c# - 事件后 Stripe 重定向

c# - 如何将运费从购物车发送到paypal

javascript - ajax 用于在 WordPress 中按类别过滤帖子

php - 无法访问父成员

sql - 为什么我应该在表格中分隔使用频率/未使用频率的列?