我已经搜索了几个小时,但找不到我正在研究的特定算法的相对解决方案。为了简化障碍,我想只用一个表格提供信息。
_____________________________________
| 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美元的优惠券。
表中的行不是特定于事务的。该表可以表示一个月内的单独事务。我们只是想找到某些回头客,我们想奖励他们与我们一起购物。
我不确定这是否只能通过 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 对表数据进行分组,那么 sum 函数将汇总一个 NAME 的所有price
。话虽如此,如果你从逻辑上思考,将sum(price)
放在 WHERE 子句中是没有任何意义的,因为 where 子句不知道要对哪个 SUM(PRICE) 进行操作NAME
(其中子句仅在生成临时视图后运行)。所以我们在 SQL 中有 HAVING
子句。这用于比较聚合功能在聚合的每个步骤的结果。
可以这样考虑:在 where 子句中,当返回数据库中的 ANNIE 行时,它不知道 SUM(PRICE) 是什么意思。在 HAVING 子句中,只有当 SQL 完成将所有 ANNIE 数据分组到一个组中并为她计算 SUM(PRICE) 时,才会执行 SUM(PRICE)>300 条件。
对于问题 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