2016-06-10 72 views
0

我有一个结果集,我需要从另一个表中加入相关的字段。MySQL连接字段结果集

我有以下两张表。 第一个表,“部件”,保持有关组件信息:

+----+-------+------------+-----------+ 
| id | name | serial_num | model_num | 
+----+-------+------------+-----------+ 
| 1 | comp1 | 0000  | AAAA  | 
| 2 | comp2 | 0001  | AAAB  | 
| 3 | comp1 | 0010  | AABA  | 
| 4 | comp2 | 0011  | AABB  | 
| 5 | comp3 | 0100  | ABAA  | 
| 6 | comp1 | 0101  | AAAA  | 
+----+-------+------------+-----------+ 

第二个表,“componentLog”跟踪哪些系统的组件属于跨时间:

+-------------+-----------+---------+---------+-------+ 
| action_date | component | system | action | notes | 
+-------------+-----------+---------+---------+-------+ 
| 2010-01-01 |   1 | CZMIL01 | added | NULL | 
| 2010-02-25 |   1 | CZMIL01 | removed | NULL | 
| 2010-01-01 |   2 | CZMIL01 | added | NULL | 
| 2010-02-03 |   2 | CZMIL01 | removed | NULL | 
| 2010-02-03 |   2 | CZMIL02 | added | NULL | 
| 2010-01-14 |   3 | CZMIL02 | added | NULL | 
| 2010-01-14 |   4 | CZMIL02 | added | NULL | 
| 2010-02-03 |   4 | CZMIL02 | removed | NULL | 
| 2010-02-03 |   4 | CZMIL01 | added | NULL | 
| 2010-01-14 |   5 | CZMIL02 | added | NULL | 
| 2010-02-25 |   6 | CZMIL01 | added | NULL | 
+-------------+-----------+---------+---------+-------+ 

我有一个查询告诉我哪些组件在指定日期的指定系统:

SELECT * 
FROM components 
WHERE id IN (
SELECT component 
FROM componentLog 
WHERE action_date <= '2010-02-25' 
AND system = 'CZMIL01' 
) 
AND id NOT IN (
SELECT component 
FROM componentLog 
WHERE action_date <= '2010-02-25' 
AND system = 'CZMIL01' 
AND action = 'removed' 
) 
ORDER BY name; 

该询问提供以下结果集:

+----+-------+------------+-----------+ 
| id | name | serial_num | model_num | 
+----+-------+------------+-----------+ 
| 6 | comp1 | 0101  | AAAA  | 
| 4 | comp2 | 0011  | AABB  | 
+----+-------+------------+-----------+ 

我需要的是从'componentLog'表中加入'action_date'字段到这个结果集,从而指定何时将组件添加到系统中。

回答

2

只需join表中所有必要的条件。

SELECT c.*,cl.action_date 
FROM components c 
JOIN componentLog cl on c.id = cl.component 
WHERE action_date <= '2010-02-25' 
AND system = 'CZMIL01' 
AND action <> 'removed' 
ORDER BY name; 

如果对于给定的系统ATLEAST一个removed动作的组件需要从结果中排除,使用

select t.*, cl.action_date 
from (
select * from components c 
where not exists (select 1 from componentlog 
        where component = c.id and action = 'removed' 
        and system = 'CZMIL01' and action_date <= '2010-02-25') 
) t 
join componentLog cl on cl.component = t.id 
WHERE system = 'CZMIL01' and action_date <= '2010-02-25' 
ORDER BY name; 
+0

检查编辑过的版本。 –

+0

感谢您的回复! 它看起来像第二个查询是在正确的轨道上。但是,给定的组件可能会在不同的方程中多次添加和删除系统。所以我不能仅仅在组件被删除的情况下排除组件。 “已删除”操作必须在适当的时间间隔内。 – user6431631

+0

您可以将'action_date somedate'条件添加到'exists'来处理它。查询修改,以包括该。 –