2011-08-07 18 views
1

は、私たちは、このようなDBている:私たちの仕事は、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; 

は、支払いなしのジョブを除きます。だから結果は「a」だけになる。

合計金額が1000より小さいすべてのジョブを取得するためにクエリを作成するにはどうすればよいですか?

答えて

0
ケース番号を にして、支払いのないジョブの金額がゼロとして計算されている限り、

の左結合が機能します。それ以外の場合、amountはNULLになるため、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の正確な構文についてはわかりません。

+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); 
組合はまた、NOの支払いを持っていない仕事を見つけ

+0

この解決策は機能します。どうもありがとうございました。 –