簡體   English   中英

MySQL連接字段到結果集

[英]MySQL join field to result set

我有一個結果集,我需要從另一個表中加入一個相關字段。

我有以下兩個表。 第一個表“ components”保留有關組件的信息:

+----+-------+------------+-----------+
| 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”字段加入此結果集,從而指定何時將組件添加到系統中。

只要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;

如果需要從結果中排除具有給定系統至少一個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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM