我现在已经搜索了几个小时,但找不到我正在处理的特定算法的相关解决方案。为了简化障碍,我想在一个表格中提供信息。
_____________________________________
| 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数组中并比较每个索引?
答案 0 :(得分:3)
您不能在WHERE
子句中使用聚合函数,必须使用HAVING
。 WHERE
在选择期间对各行进行操作,HAVING
在汇总后对最终结果进行操作。
SELECT *, SUM(price*qty) as Total
FROM table
GROUP BY user
HAVING Total >= 300 AND SUM(qty) <= 3
答案 1 :(得分:0)
SUM
是一个聚合函数,意味着它适用于一组clubbed行。 S说我正在基于NAME对表数据进行分组,然后sum函数将对一个NAME的所有price
求和。
说完这个之后,如果从逻辑上考虑将sum(price)
置于WHERE子句中是没有意义的,因为where子句不知道哪个({1}}操作的SUM(PRICE)(where子句)仅在生成临时视图后才运行)。
所以我们在SQL中有NAME
子句。这用于比较聚合的每个步骤的聚合函数的结果。
像这样考虑: 在where子句中,当返回数据库中的ANNIE行时,它不知道SUM(PRICE)的含义。 在HAVING子句中,仅当SQL将所有ANNIE数据分组到一个组并为她计算SUM(PRICE)时,才执行SUM(PRICE)&gt; 300条件。
问题1:
HAVING
问题2:
SELECT USER, SUM(PRICE)
FROM table
GROUP BY user
HAVING SUM(PRICE) >= 300 AND SUM(QTY) <= 3