我们有这样一个数据库:

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/

10-16 00:33