限制表连接中的查询结果

时间:2014-12-29 21:12:47

标签: php mysql

除非状态=来自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>

包括Sally,因为她没有OTD的身份。鲍勃被排除在外,因为他有OTD身份。

1 个答案:

答案 0 :(得分: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

认真考虑在这种情况下你想要包括什么。