2012-07-24 2 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] 

Chris가 하루 후에 Skids로 이동 했으므로 아무도 작업하지 않으므로.

지금까지 :

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

+0

@ user1549575 왜 작동하지 않는지 설명 할 수 있습니까? 오류, 잘못된 결과입니까? 또한, 당신은 내 질문에 대답 할 수있는 질문에 의견을 물었다. "현재 찍은"이란 무엇을 의미합니까? –

+0

질문에 답할 수 없어 작동하지 않습니다. 문제는 할당 된 적이없는 작업을 선택하는 것이 아닙니다. 할당 내역을 올바르게 정렬하는 것입니다. –

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

먼저 현재 작업 할당 목록 만보고 있어야합니다. 주문만으로는 충분하지 않습니다. 설정 한 방식에 따라 할당 된 작업 할당의 고유 한 하위 집합이 필요하며 이는 가장 최근의 할당입니다.

그래서 당신이

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"의 값을 전달하고 그것을 수 얼마나 오래 일자리가 유휴 상태인지 알려줄 것입니다.

관련 문제