2017-10-12 87 views
-1

我有一个查询返回货运信息。有两种类型的物品出货,驱动器和钥匙。在物品发货之前,它不会出现在drive_tracking表格中,并且我已将IFNULL添加到那里以弥补这一点。这是查询。连接条件满足时未选择行?

SELECT a.id AS drive_id, CONCAT(a.drive_capacity, a.drive_unit) AS drive_type, 
IFNULL(d.type,'drive') AS category, IFNULL(d.status,'outbound') AS ship_status 
FROM drive_details a 
LEFT JOIN copy_details b ON a.id = b.drive_id 
LEFT JOIN records c ON b.id = c.copy_id 
LEFT JOIN drive_tracking d ON a.id = d.drive_id AND d.status = 'outbound' 
WHERE c.identifier = '9956852' 

这里是在drive_tracking表中没有匹配行的结果。

------------------------------------------ 
|drive_id|drive_type|category|ship_status| 
+----------------------------------------+ 
|208  |1TB  |drive |outbound | 
+----------------------------------------+ 

但我有问题,就是一旦有出货的关键存在于drive_tracking表我再也看不到驱动器的状态,只有按键。

------------------------------------------ 
|drive_id|drive_type|category|ship_status| 
+----------------------------------------+ 
|208  |1TB  |key  |outbound | 
+----------------------------------------+ 

但我需要回到...

------------------------------------------ 
|drive_id|drive_type|category|ship_status| 
+----------------------------------------+ 
|208  |1TB  |drive |outbound | 
+----------------------------------------+ 
|208  |1TB  |key  |outbound | 
+----------------------------------------+ 

我知道这个问题是与左连接上drive_tracking表,但一切我已经试过后,我无法找到一个方法来包括驱动器行。

来自drive_details表的行。

----------------------------------------------------------- 
|id |date   |capacity|unit |encrypted|status  | 
+---------------------------------------------------------+ 
|208 |2017-08-23 |1  |TB |1  |disconnected| 
+---------------------------------------------------------+ 

drive_tracking表中排。

----------------------------------------------------------- 
|id |drive_id |type |status |number  |ship_date | 
+---------------------------------------------------------+ 
|134 |208  |key |outbound |729292222038 |2017-09-10 | 
+---------------------------------------------------------+ 
+0

嗨。你不清楚你想要什么。请阅读并采取最小化,完整和可验证的示例。请修改问题的澄清,而不是评论。 PS首先显示包含所需信息的左连接,然后开始在选择子句中限制和修改它。您也可以删除b&c并限制为某些a.id(s)。我们得到'SELECT a.id,d.type,d.status FROM drive_details a LEFT JOIN drive_tracking d ON a.id = d.drive_id AND d.status ='outbound''。这是否需要数据来生成你想要的结果?你需要什么?什么*是你想要的结果? – philipxy

+0

要清楚的最好方法是在我之前的评论中写下描述该查询的以下句子的适当变体。 (返回相关的中间FROM子句数据sans b&c。)“(id,type,status)在drive_details&(d.drive_id,...)中的/ * aliases * /(a.id,..) )in drive_tracking&/ * left join * /(a.id = d.drive_id&d.status ='outbound'or not(a.id = d.drive_id&d.status ='outbound')&d.status is null))&/ * select */id = a.drive_id&...,/ * select */for a。*&d。*的某些值。 – philipxy

回答

0

在case1:没有记录从drive_tracking加入,所以有null,所以它给驱动器在类别。如果你把d.status ='outbound'加入WHERE条件,那么我认为它不会返回任何记录。

案例2:一个记录是从drive_tracking中加入的,因此它给出了这样的结果。

请运行下面的查询并检查相同的计数。

SELECT count(0) 
FROM drive_details a 
LEFT JOIN copy_details b ON a.id = b.drive_id 
LEFT JOIN records c ON b.id = c.copy_id 
LEFT JOIN drive_tracking d ON a.id = d.drive_id AND d.status = 'outbound' 
WHERE c.identifier = '9956852' 

它将返回1.这意味着只有单个记录可能与给定的数据。

如果您希望根据第三方输出,请告诉我drive_tracking和drive_details表中的数据。

+0

返回的计数是1.但问题是,'drive_id','drive_details'和'drive_tracking'表没有任何共同之处。 – EternalHour

+0

我已添加表格数据。我也尝试在'drive_details'中添加一个'type'列并加入,但仍然无法正确显示。 – EternalHour

+0

感谢您提供数据。在这里不可能得到第三个输出。如上所述,您在案例1中获得了驱动器。如果您希望获得驱动器,则需要在drive_tracking中添加一个drive_tracking记录,驱动器id = 208,状态不等于outboud或type为null。 – Jack

相关问题