mysql选择查询问题

时间:2011-08-07 00:10:16

标签: mysql sql group-by sum

我们有这样的数据库:

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的所有工作?

3 个答案:

答案 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上的确切语法。