首页 > 解决方案 > SQL 查询未按预期返回

问题描述

我正试图从两个接受公司报价的关系学生那里回来。为了测试查询,我用一小部分记录填充了表,但它没有正常运行。申请状态属性中可能出现 4 种情况:“Offer Accepted”、“Offer Rejected”、“No Offer”、“Pending”。

我正在尝试计算“Offer Accepted”和“Offer Rejected”的数量,并输出收到超过 2 个工作机会的学生的姓名。为什么这不起作用?逻辑上看起来应该是这样?

我收到的收到录取通知书的学生人数有误。我有时会收到 4 个学生的名字,而我应该只收到 1 个。如果我添加更多测试用例,测试用例会继续以相同的方式运行。

应用关系测试数据:

INSERT INTO applications
VALUES (1, 1001, 'Offer Accepted'), (2, 1001, 'Offer Rejected'), (3, 1001, 'No Offer'), (1, 1000, 'No Offer'), (3, 1000, 'Offer Rejected'), (4, 1000, 'Offer Rejected'), (5, 1000, 'Offer Accepted'), (2, 1003, 'Offer Accepted'), (1, 1002, 'Offer Accepted');

学生关系示例数据:

(1000, 'John Smith', 'Electrical Engineering', 3.6)

标签: mysql

解决方案


COUNT() 只返回记录数。发生的情况是相等性检查appStatus = 'Offer Accepted'评估为 0 或 1,具体取决于它是否为真。然后 count 函数只是将 0 和 1 的计数相加,而不管值如何。

您可以使用 SUM 来实际获取 1 的数量(即,该条件为真的记录数)。

SELECT SName
FROM students
INNER JOIN applications ON applications.SID = students.SID
GROUP BY students.SName
HAVING SUM(appStatus = 'Offer Accepted') + SUM(appStatus = 'Offer Rejected') > 2

推荐阅读