2011-08-07 4 views
1

У нас есть БД, как это:MySQL вопрос выберите запрос

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; 

не включает рабочие места без каких-либо платежей. Таким образом, мы получаем только «а».

Как мы должны построить запрос для получения всех заданий, где сумма платежей меньше 1000?

ответ

0

левое соединение будет работать, если вы используете оператор 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. это работает на oracle, не уверен в точном синтаксисе mysql.

+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; 
+0

Левое соединение не помогает в этом случае. –

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); 

Союз также находит рабочие места, которые не имеют никаких платежей

+0

Это решение работает. Большое спасибо. –