2010-11-19 36 views
0

我遇到查詢問題,問題是我離開連接三次從同一個表。具有多個連接的查詢將只返回其中一個我的左連接

有問題的查詢是這樣的:

SELECT 
     o.order_id, 
     n.title, 
     c.first_name, 
     tdv5.tid, 
     tdv6.name, 
     tdv8.name AS settlement_month 
FROM orders o 
     join products p   on o.product_id = p.nid 
     join node n    on p.nid = n.nid 
     join customers c   on o.customer_email = c.customer_email 
     join term_node tn   on tn.nid = p.nid 
     join term_data tdv6  on tn.tid = tdv6.tid AND tdv6.vid = 6 
     left join term_data tdv5 on tn.tid = tdv5.tid AND tdv5.vid = 5 
     left join term_data tdv8 on tn.tid = tdv8.tid AND tdv8.vid = 8 

當我使用這個查詢只有先使用tn.tid將加入公司。例如,如果最後三個唯一的加入是這樣的:

join term_data tdv6  on tn.tid = tdv6.tid AND tdv6.vid = 6 

它會正常工作。與

left join term_data tdv5 on tn.tid = tdv5.tid AND tdv5.vid = 5 

而且

left join term_data tdv8 on tn.tid = tdv8.tid AND tdv8.vid = 8 

一樣的,但是當我將它們組合起來,他們不會在所有的工作。當我組合三個查詢時,只有tdv6有效。

你有什麼問題的建議嗎?謝謝。

回答

1

如果你嘗試把一個WHERE子句,像這樣:

SELECT 
     o.order_id, 
     n.title, 
     c.first_name, 
     tdv5.tid, 
     tdv6.name, 
     tdv8.name AS settlement_month 
FROM orders o 
     join products p   on o.product_id = p.nid 
     join node n    on p.nid = n.nid 
     join customers c   on o.customer_email = c.customer_email 
     join term_node tn   on tn.nid = p.nid 
     join term_data tdv6  on tn.tid = tdv6.tid 
     left join term_data tdv5 on tn.tid = tdv5.tid 
     left join term_data tdv8 on tn.tid = tdv8.tid 
WHERE 
     tdv6.vid = 6 and 
     tdv5.vid = 5 and 
     tdv8.vid = 8 
+0

然後它根本不會返回任何行。我需要不返回任何內容的左連接的NULL值。 – 2010-11-19 14:36:54

+0

將條件放在WHERE中會使您的左連接成爲內連接。 – GolezTrol 2010-11-20 23:23:47

0

你肯定你的結論是正確的?空值將出現在相同的行,因此,當沒有記錄where(5,8)中的term_data.tid = = tn.tid和term_data.vid時,您將只獲得tdv6的記錄。這些記錄的tid和/或settlement_month將爲NULL。

您是否也許想要左連接tdv6?它現在是一個內部聯接,這意味着您需要tdv6中的記錄才能從tdv5或tdv8獲取具有相同tid的記錄。

+0

如果可用,我需要所有來自行的3個信息。那可能嗎? – 2010-11-20 22:21:17

+0

您是否嘗試將tdv6上的(INNER)JOIN轉換爲LEFT JOIN,如我所建議的?這應該夠了吧。 – GolezTrol 2010-11-20 23:25:07