MySQL - 根据具体条件选择金额
MySQL - Selecting the sum amount based on specific condition
我已经搜索了几个小时,但找不到我正在研究的特定算法的相关解决方案。为了简化障碍,我想在一个 table.
中提供信息
_____________________________________
| User | Item | price | qty |
-------------------------------------
| Annie | Dress | 80 | 1 |
| Bob | Jeans | 65 | 3 |
| Cathy | Shoes | 60 | 4 |
| David | Shirts | 40 | 6 |
| Annie | Shoes | 60 | 2 |
| Bob | Shirts | 55 | 2 |
| Cathy | Jeans | 65 | 1 |
| David | Ties | 20 | 5 |
-------------------------------------
问题#1:显示在商店购物的总价为 300 或以上且购买数量小于或等于 3 的用户。这些购物者将被邮寄一张 40 美元的优惠券。
问题#2:显示总数量大于或等于7且总价格为275或更多的用户。这些购物者将收到 20 美元的优惠券。
table 中的行不是特定于交易的。 table 可以表示一个月内的单独交易。我们只是想找到某些回头客,我们愿意奖励他们在我们这里购物。
我不确定这是否只能通过 MySQL 完成,或者我是否需要单独查询并将行存储到数组中并一一比较。
目前我尝试过的有以下几种:
SELECT * FROM table where SUM(price) as Total >= 300 AND SUM(qty) <=3;
经过研究,我也尝试了以下方法:
SELECT SUM(price) as Total FROM table WHERE SUM(qty) <=3;
我一直在 MySQL shell 中收到语法错误。您不必为我解决问题,但如果您能指导我解决问题的逻辑,我将不胜感激。
最后我想问一次,我可以只用 MySQL 解决这个问题还是我需要将行存储到 PHP 数组中并比较每个索引?
不能在WHERE
子句中使用聚合函数,必须使用HAVING
。 WHERE
在选择期间对单个行进行操作,HAVING
在聚合后对最终结果进行操作。
SELECT *, SUM(price*qty) as Total
FROM table
GROUP BY user
HAVING Total >= 300 AND SUM(qty) <= 3
SUM
是一个聚合函数,这意味着它适用于一组成串的行。 S 说我正在根据 NAME 对 table 数据进行分组,然后求和函数将对一个 NAME 的所有 price
求和。
话虽如此,如果您从逻辑上考虑将 sum(price)
放在 WHERE 子句中是没有任何意义的,因为 where 子句不知道要对哪个 SUM(PRICE) 进行操作 NAME
(where 子句仅在生成临时视图后运行)。
所以我们在 SQL 中有 HAVING
子句。这用于在聚合的每个步骤比较聚合函数的结果。
这样考虑:
在 where 子句中,当返回数据库中的 ANNIE 行时,它不知道 SUM(PRICE) 是什么意思。
而在 HAVING 子句中,SUM(PRICE)>300 条件仅在 SQL 完成将所有 ANNIE 数据分组并为她计算 SUM(PRICE) 时执行。
对于问题 1:
SELECT USER, SUM(PRICE)
FROM table
GROUP BY user
HAVING SUM(PRICE) >= 300 AND SUM(QTY) <= 3
对于问题 2:
SELECT USER, SUM(PRICE)
FROM table
GROUP BY user
HAVING SUM(PRICE) >= 275AND SUM(QTY) >=7
我已经搜索了几个小时,但找不到我正在研究的特定算法的相关解决方案。为了简化障碍,我想在一个 table.
中提供信息_____________________________________
| User | Item | price | qty |
-------------------------------------
| Annie | Dress | 80 | 1 |
| Bob | Jeans | 65 | 3 |
| Cathy | Shoes | 60 | 4 |
| David | Shirts | 40 | 6 |
| Annie | Shoes | 60 | 2 |
| Bob | Shirts | 55 | 2 |
| Cathy | Jeans | 65 | 1 |
| David | Ties | 20 | 5 |
-------------------------------------
问题#1:显示在商店购物的总价为 300 或以上且购买数量小于或等于 3 的用户。这些购物者将被邮寄一张 40 美元的优惠券。
问题#2:显示总数量大于或等于7且总价格为275或更多的用户。这些购物者将收到 20 美元的优惠券。
table 中的行不是特定于交易的。 table 可以表示一个月内的单独交易。我们只是想找到某些回头客,我们愿意奖励他们在我们这里购物。
我不确定这是否只能通过 MySQL 完成,或者我是否需要单独查询并将行存储到数组中并一一比较。
目前我尝试过的有以下几种:
SELECT * FROM table where SUM(price) as Total >= 300 AND SUM(qty) <=3;
经过研究,我也尝试了以下方法:
SELECT SUM(price) as Total FROM table WHERE SUM(qty) <=3;
我一直在 MySQL shell 中收到语法错误。您不必为我解决问题,但如果您能指导我解决问题的逻辑,我将不胜感激。
最后我想问一次,我可以只用 MySQL 解决这个问题还是我需要将行存储到 PHP 数组中并比较每个索引?
不能在WHERE
子句中使用聚合函数,必须使用HAVING
。 WHERE
在选择期间对单个行进行操作,HAVING
在聚合后对最终结果进行操作。
SELECT *, SUM(price*qty) as Total
FROM table
GROUP BY user
HAVING Total >= 300 AND SUM(qty) <= 3
SUM
是一个聚合函数,这意味着它适用于一组成串的行。 S 说我正在根据 NAME 对 table 数据进行分组,然后求和函数将对一个 NAME 的所有 price
求和。
话虽如此,如果您从逻辑上考虑将 sum(price)
放在 WHERE 子句中是没有任何意义的,因为 where 子句不知道要对哪个 SUM(PRICE) 进行操作 NAME
(where 子句仅在生成临时视图后运行)。
所以我们在 SQL 中有 HAVING
子句。这用于在聚合的每个步骤比较聚合函数的结果。
这样考虑: 在 where 子句中,当返回数据库中的 ANNIE 行时,它不知道 SUM(PRICE) 是什么意思。 而在 HAVING 子句中,SUM(PRICE)>300 条件仅在 SQL 完成将所有 ANNIE 数据分组并为她计算 SUM(PRICE) 时执行。
对于问题 1:
SELECT USER, SUM(PRICE)
FROM table
GROUP BY user
HAVING SUM(PRICE) >= 300 AND SUM(QTY) <= 3
对于问题 2:
SELECT USER, SUM(PRICE)
FROM table
GROUP BY user
HAVING SUM(PRICE) >= 275AND SUM(QTY) >=7