Php 限制表联接中的查询结果

Php 限制表联接中的查询结果,php,mysql,Php,Mysql,我需要从上一次交付中选择员工id,除非hta表中的状态=OTD。然后我需要从employee表中获取所有剩余的员工id,并显示这些结果。不幸的是,状态为otd的员工也在employee表中。我可以写一个将返回这些结果的查询吗?还是我必须用不同的方式来做?如果是的话,你能指引我吗 SELECT h.employee_id , MAX(h.delivery_date) , e.employee_first , h.status FRO

我需要从上一次交付中选择员工id,除非hta表中的状态=OTD。然后我需要从employee表中获取所有剩余的员工id,并显示这些结果。不幸的是,状态为otd的员工也在employee表中。我可以写一个将返回这些结果的查询吗?还是我必须用不同的方式来做?如果是的话,你能指引我吗

   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身份。Bob被排除在外,因为他有OTD状态。

如果您在问题中包括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”的。 所有员工都在表(u employees)中。例外情况见表A。这将为您提供您感兴趣的员工

select employee_id 
from table_employees
where employee_id not in (select employee_id
                          from table_hta
                          where status = 'OTD');
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');
我们可以按原样使用WHERE子句。顺便说一句,为了让maxdeliverydates成为一个糟糕的交货时间名称,我们做了一个左连接来保留我们感兴趣的员工id号

select employee_id 
from table_employees
where employee_id not in (select employee_id
                          from table_hta
                          where status = 'OTD');
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
仔细考虑在这种情况下您希望包含的内容。

请发布一些示例数据,可能是5-10行,以及您的预期结果,因为这将帮助其他用户了解您试图实现的目标。如果你有雄心壮志的话,一份工作通常是最有帮助的。适当的DDL会很好。另外,仅供参考,目前SO上[MYSQL]标记下的右连接大约有1700次,而左连接大约有38000次。只需说‘它被标记为php,mysql只需说‘谢谢’。虽然您可能认为delivery_date对于一个列来说是一个糟糕的名称,但它实际上是一个datetime列,还有一个列是delivery_time,它是一个time列。所以当你看整张桌子的时候,它是有意义的。有一个datetime列和一个time列也没有多大意义,但它就是这样设置的。非常感谢你的帮助!!!你的回答非常有效!