Php 限制表联接中的查询结果
我需要从上一次交付中选择员工id,除非hta表中的状态=OTD。然后我需要从employee表中获取所有剩余的员工id,并显示这些结果。不幸的是,状态为otd的员工也在employee表中。我可以写一个将返回这些结果的查询吗?还是我必须用不同的方式来做?如果是的话,你能指引我吗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
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列也没有多大意义,但它就是这样设置的。非常感谢你的帮助!!!你的回答非常有效!