2012-07-24 56 views
2

我想選擇當前未分配給用戶的作業。SQL查詢 - 不在一組已經使用的項目中

Users table: id | name 
Jobs:  id | name 
Assigned: id | user_id | job_id | date_assigned 

我想選擇所有當前未採取的作業。例如:

用戶:

id | name 
-------------- 
1 | Chris 
2 | Steve 

喬布斯

id | name 
--------------- 
1 | Sweep 
2 | Skids 
3 | Mop 

分配

id | user_id | job_id | date_assigned 
------------------------------------------------- 
1 | 1  | 1   | 2012-01-01 
2 | 1  | 2   | 2012-01-02 
3 | 2  | 3   | 2012-01-05 

沒有兩個人可以分配相同的工作。所以查詢將返回

[1, Sweep] 

由於沒有人正在努力,因爲克里斯一天後搬到了斯基德。

到目前爲止:

SELECT 
    * 
FROM 
    jobs 
WHERE 
    id 
NOT IN 
    (
     SELECT 
      DISTINCT(job_id) 
     FROM 
      assigned 
     ORDER BY 
      date_assigned 
     DESC 
    ) 

然而,這個查詢在相同的數據集中返回NULL。不解決掃描工作現在處於打開狀態,因爲它目前尚未開始工作。

回答

2
SELECT a.* 
FROM jobs a 
LEFT JOIN 
(
    SELECT a.job_id 
    FROM assigned a 
    INNER JOIN 
    (
     SELECT MAX(id) AS maxid 
     FROM assigned 
     GROUP BY user_id 
    ) b ON a.id = b.maxid 
) b ON a.id = b.job_id 
WHERE b.job_id IS NULL 

這會得到每個用戶最近的工作。一旦我們有了這些工作的清單,我們就選擇不在該清單上的所有工作。

+0

這似乎不適合我。但我會繼續嘗試。 – user1549575 2012-07-24 19:02:03

+0

@ user1549575你至少可以解釋爲什麼它不起作用?這是一個錯誤,錯誤的結果?另外,你能回答我在問題評論中提出的問題嗎? 「目前採取」是什麼意思? – 2012-07-24 19:04:20

+0

它不會工作,因爲它不回答問題。問題不在於選擇從未分配的作業。這是要正確排序分配歷史。 – 2012-07-24 19:08:09

1

你可以試試這個變種:

select * from jobs 
where id not in (
    select job_id from (
    select user_id, job_id, max(date_assigned) 
     from assigned 
    group by user_id, job_id)); 
0

我想你可能想:

SELECT * 
FROM jobs 
WHERE id NOT IN (SELECT job_id 
       from assigned 
       where user_id is not null 
       ) 

這是假設重新分配有人更改原始分配的用戶ID。這是否發生?順便說一下,我也簡化了子查詢。

0

首先您需要查看僅當前作業分配的列表。訂購是不夠的。您設置的方式,您需要一個來自Assigned的作業分配的不同子集,它們是最近的作業。

所以,你想要一個分組子查詢像

select job_id, user_id, max(date_assigned) last_assigned from assigned group by job_id, user_id 

把它放在一起,你會得到

select id, name from jobs 
where id not in (
    select job_id as id from (
    select job_id, user_id, max(date_assigned) last_assigned from assigned 
    group by job_id, user_id 
) 
) 

作爲一個額外的功能,你可以放過去「last_assigned」的值,並將其會告訴你一份工作閒置了多久。

相關問題