MySQL выбрать вопрос вопроса - PullRequest
1 голос
/ 07 августа 2011

У нас есть такая БД:

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.

* 1007результат мы должны рабочие места «а», «с» и «г».Но наш запрос:
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 ]

2 голосов
/ 07 августа 2011

Я думаю, вам может понадобиться 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;
0 голосов
/ 07 августа 2011

left join будет работать, если вы используете оператор case, чтобы гарантировать, что сумма рассчитывается как ноль для рабочих мест без выплат. В противном случае сумма будет нулевой, и поэтому ее нельзя будет сравнить с 1000 в предложении HAVING.

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. это работает на оракуле, не уверен в точном синтаксисе на MySQL.

0 голосов
/ 07 августа 2011

Вам необходимо присоединить 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);

Профсоюз также находит рабочие места, на которые НЕТ платежей

...