MySQL - 根据具体情况选择总和金额

时间:2015-01-02 05:21:44

标签: php mysql data-manipulation

我现在已经搜索了几个小时,但找不到我正在处理的特定算法的相关解决方案。为了简化障碍,我想在一个表格中提供信息。

_____________________________________
|  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数组中并比较每个索引?

2 个答案:

答案 0 :(得分:3)

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