2014-12-29 2 views
-2

hta 테이블의 상태 = OTD가 아닌 한 마지막 전달에서 직원 ID를 선택해야합니다. 그런 다음 나머지 직원 ID를 직원 테이블에서 가져 와서 그 결과를 표시해야합니다. 불행히도 otd의 상태를 가진 직원도 직원 테이블에 있습니다. 이 결과를 반환하는 쿼리를 작성할 수 있습니까? 아니면 다르게해야합니까? 그렇다면 나를 안내 할 수 있습니다.테이블 조인으로 쿼리 결과 제한

SELECT h.employee_id 
     , MAX(h.delivery_date) 
     , e.employee_first 
     , h.status 
    FROM TABLE_HTA h 
    RIGHT 
    JOIN TABLE_EMPLOYEES e 
     ON h.employee_id = e.employee_id 
    WHERE h.status <> "OTD" 
    GROUP 
     BY h.employee_id 
    ORDER 
     BY MAX(h.delivery_date) ASC 

Table_hta<br> 
order_id | employee_id | status | delivery_date |<br> 
     1 | 23  | OTD | 1/1/15 3:45pm<br> 
     2 |  24  |DELIVER | 1/1/15 3:50pm<br> 
     3 |  25  |DELIVER | 1/1/15 3:51pm<br> 
<br> 
Table_employees<br> 
employee_id | employee_first |<br> 
    23  Bob<br> 
    24  James<br> 
    25  Henry<br> 
    26  Sally<br> 

Results<br> 
employee_id | employee_first | delivery_date<br> 
     26 |Sally<br> 
     24 |James |1/1/15 3:50pm<br> 
     25 |James |1/1/15 3:51pm<br> 

그녀는 상태가 OTD가 아니기 때문에 Sally가 포함되었습니다. Bob은 OTD라는 지위를 가지고 있기 때문에 제외되었습니다.

+0

예상 결과와 함께 일부 샘플 데이터 (어쩌면 5-10 행)를 게시하십시오. 다른 사용자가 수행하려는 것을 볼 수 있으므로 도움이됩니다. 야심적이라면 [SQL Fiddle] (http://www.sqlfiddle.com)이 가장 도움이됩니다. – AdamMc331

+0

예. 적절한 DDL이 좋습니다. 또한 참고로, 현재 "MYSQL"태그 아래에 약 1700 건의 "RIGHT JOIN"이 있습니다 (LEFT JOIN의 약 38,000 건 발생). 그냥 선생님 ' – Strawberry

+0

그것은 PHP와 mysql 그냥 태그' – David

답변

0

질문에 CREATE TABLE 및 INSERT 문을 포함 시키면 더 많은 답변을 얻을 수 있습니다. 관심있는

create table table_hta (
    order_id integer primary key, 
    employee_id integer not null, 
    status varchar(10) not null, 
    delivery_date datetime not null 
); 

insert into table_hta values 
(1, 23, 'OTD', '2015-01-01 3:45'), 
(2, 24, 'DELIVER', '2015-01-01 3:50'), 
(3, 25, 'DELIVER', '2015-01-01 3:51'); 

create table table_employees (
    employee_id integer primary key, 
    employee_first varchar(10) not null 
); 

insert into table_employees values 
(23, 'Bob'), 
(24, 'James'), 
(25, 'Henry'), 
(26, 'Sally'); 

직원들은 'OTD'의 상태를 가지고있는 사람을 제외하고

  • 모든 직원

    ,
  • 이다.

모든 직원은 "table_employees"에 있습니다. 예외는 "table_hta"에 있습니다. 이렇게하면 관심있는 직원을 볼 수 있습니다.

select employee_id 
from table_employees 
where employee_id not in (select employee_id 
          from table_hta 
          where status = 'OTD'); 

WHERE 절은 그대로 사용할 수 있습니다. (그런데 배달 시간에 대한 빈약 한 이름) 최대 배달 날짜를 얻으려면, 우리는 왼쪽 우리가 관심있는 직원 ID 번호를 유지하기 위해 가입 할.

select e.employee_id, e.employee_first, h.delivery_date 
from table_employees e 
left join (select employee_id, max(delivery_date) as delivery_date 
      from table_hta group by employee_id) h 
     on e.employee_id = h.employee_id 
where e.employee_id not in (select employee_id 
          from table_hta 
          where status = 'OTD'); 

을 사실 당신이 최대 배달 날짜 (배달 시간)에 관심이 있으시면 표에 여러 배달 날짜가 ​​허용된다는 것을 의미합니다. 여러 배송 날짜를 허용하는 경우이 같은 데이터도 허용됩니다.

 
order_id | employee_id | status | delivery_date | 
     1 |  24  | OTD | 1/1/15 3:45pm 
     2 |  24  |DELIVER | 1/1/15 3:50pm 

이와 같은 상황에 포함하려는 것에 대해 열심히 생각하십시오.

+0

고맙습니다. delivery_date는 열에 대한 열등한 이름이라고 생각할 수도 있지만 실제로는 datetime 열이고 delivery_time은 시간 열인 다른 열이 있습니다. 그래서 전체 표를 보면 의미가 있습니다. 날짜 시간 열과 시간 열을 갖는 것은 그다지 의미가 없지만 설정 방법입니다. 도와 주셔서 정말 감사합니다!!! 당신의 대답은 완벽하게 작동했습니다! – David