2011-08-07 62 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

左連接將工作,只要您使用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的確切語法。

+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

該解決方案有效。非常感謝你。 –