我们有这样一个数据库:
CREATE TABLE `jobs` (
`id` int NOT NULL AUTO_INCREMENT,
`job` varchar(255),
PRIMARY KEY (`id`)
);
INSERT INTO `jobs` VALUES
(1,'a'),
(2,'b'),
(3,'c'),
(4,'d');
CREATE TABLE `payments` (
`job_id` int,
`amount` int
);
INSERT INTO `payments` VALUES
(1,100),
(1,100),
(2,600),
(2,600);
我们的任务是:
找所有的工作,报酬总额小于1000。
因此,我们应该做“a”、“c”和“d”。但我们的问题是:
SELECT job
FROM jobs j
JOIN payments p ON j.id=p.job_id
GROUP BY job_id
HAVING sum(amount) < 1000;
不包括没有任何报酬的工作。所以结果我们只能得到“a”。
我们应该如何构造查询以获得付款总额小于1000的所有工作?
最佳答案
只要使用case语句确保
对于没有报酬的工作,金额计算为零。否则,amount将为空,因此不能与HAVING子句中的1000进行比较。
SELECT j.id job_id ,sum(case when amount is null then 0 else amount end)
FROM jobs j LEFT JOIN payments p ON j.id=p.job_id
GROUP BY j.id
HAVING sum(case when amount is null then 0 else amount end) < 1000;
注意:这在oracle上有效,但不确定mysql上的确切语法。
关于mysql - mysql选择查询问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6969846/