SQL请求中的数据输出错误

时间:2015-06-11 18:19:26

标签: mysql

我有一张名为payments

的表格
CREATE TABLE payments (
`id` INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
`student_id` INT NOT NULL,
`datetime` DATETIME NOT NULL,
`amount` FLOAT DEFAULT 0,
INDEX `student_id` (`student_id`)
);

有必要创建一个查询,查找所有student_id,其总金额小于最大金额。 (它可以是多个付款金额相同的用户)

假设这是一个测试数据:

== Dumping data for table payments
id-student_id-datetime-amount
|1|4|2015-06-11 00:00:00|2
|2|5|2015-06-01 00:00:00|6
|3|1|2015-06-03 00:00:00|8
|4|2|2015-06-02 00:00:00|9
|5|4|2015-06-09 00:00:00|6
|6|5|2015-06-06 00:00:00|3
|7|2|2015-06-05 00:00:00|6
|8|3|2015-06-09 00:00:00|12
|14|1|2015-06-01 00:00:00|0
|15|1|2015-06-03 00:00:00|7
|16|6|2015-06-02 00:00:00|0
|17|6|2015-06-07 00:00:00|0
|18|6|2015-06-05 00:00:00|0

下一个查询显示所有学生的总金额

SELECT `student_id`, SUM(amount) as `sumamount`
FROM `payments`  
GROUP BY `student_id`
ORDER BY `sumamount` DESC

以下是由sumamount

订购的此查询的写入输出
student_id  sumamount
1   15
2   15
3   12
5   9
4   8
6   0

但问题是,当我试图让付费低于最大价格的用户时,它给了我错误的答案

以下是获取第二位用户的查询:

SELECT `student_id`, SUM(amount) as `sumamount`
FROM `payments`  
GROUP BY `student_id`
HAVING `sumamount` < MAX(sumamount)
ORDER BY `sumamount` DESC

结果如下

student_id  sumamount
3   12
4   8
6   0

我们可以看到student_id = 5错过了,我不明白为什么。

1 个答案:

答案 0 :(得分:1)

您需要在子查询中计算MAX(sumamount),以便MAX不按student_id分组。

SELECT `student_id`, SUM(amount) as `sumamount`, maxsum
FROM `payments`
CROSS JOIN (SELECT MAX(sumamount) AS maxsum
            FROM (SELECT SUM(amount) AS sumamount
                  FROM payments
                  GROUP BY student_id) t1) t2
GROUP BY `student_id`
HAVING `sumamount` < maxsum
ORDER BY `sumamount` DESC

DEMO