2017-10-12 89 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

相關問題