2014-12-29 163 views
-2

我需要從最後一次交付中選擇員工標識,除非狀態= OTD來自hta表。然後,我需要從員工表中獲取所有剩餘的員工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> 

Sally被列入,因爲她沒有OTD狀態。鮑勃被排除了,因爲他有狀態OTD。

+0

請發佈一些示例數據(可能是5-10行)以及您的預期結果,因爲它可以幫助其他用戶看到您想要完成的任務。如果您雄心勃勃,[SQL小提琴](http://www.sqlfiddle.com)通常最有幫助。 – AdamMc331

+0

是的。適當的DDL會很好。此外,僅供參考,目前在SO上的[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對於列而言是一個糟糕的名稱,但它實際上是一個日期時間列,而另一列是delivery_time,它是一個時間列。所以當你看到整個桌子時,它確實有意義。有一個日期時間列和時間列也沒有多大意義,但這就是它的設置。非常感謝你的幫助!!!你的答案完美無缺! – David