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子句中使用聚合函数,必须使用HAVINGWHERE 在选择期间对单个行进行操作,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