我们有这样的数据库:
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的所有工作?
答案 0 :(得分:2)
我认为您可能需要LEFT JOIN
SELECT job
FROM jobs j LEFT JOIN payments p ON j.id=p.job_id
GROUP BY job_id
HAVING sum(amount) < 1000;
答案 1 :(得分:0)
您需要将job
加入到总和查询的结果中:
SELECT *
from job j
join (SELECT job_id, sum(amount)
FROM jobs j
JOIN payments p ON j.id=p.job_id
GROUP BY job_id
HAVING sum(amount) < 1000) x on x.job_id = j.job_id
union
SELECT * from job where job_id not in (select job_id from payments);
工会还找到没有付款的工作
答案 2 :(得分:0)
左连接将起作用,只要您使用case语句来确保 对于没有付款的工作,金额计算为零。否则,金额将为空,因此无法与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;
N.B。这适用于oracle,不确定mysql上的确切语法。