2010-06-08 89 views
0

我有一個相當簡單的查詢,我嘗試編寫。當我嘗試從兩個表中加入數據時,行會丟失

如果我運行下面的查詢:

SELECT parts.id, parts.type_id 
FROM parts 
WHERE parts.type_id=1 
    OR parts.type_id=2 
    OR parts.type_id=4 
ORDER BY parts.type_id; 

我去退還所有我所期望的行。現在,當我試圖抓住從另一個表parent_unit用下面的查詢六行突然掉出結果:

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts, serialized_parts sp 
WHERE (parts.type_id=1 OR parts.type_id=2 OR parts.type_id=4) 
    AND sp.parts_id = parts.id 
ORDER BY parts.type_id 

在過去,我從來沒有真正在我的查詢處理的手術室所以我可能只是做錯了。這就是說,我猜這只是一個簡單的錯誤。讓我知道你是否需要樣本數據,我會發布一些。謝謝。

+2

請學會使用顯式連接。 – HLGEM 2010-06-08 19:24:24

+0

支持HLGEM的評論,請參閱:http://stackoverflow.com/questions/2241991/in-mysql-queries-why-use-join-instead-of-where – 2010-06-08 19:26:24

回答

0

檢查缺少6行的parts.parts_id的值。您可能在sp.parts_id中沒有相應的值(或者parts.parts_id的值爲空)。請注意,它必須完全匹配才能工作。

作爲OR字符串的替代方法,您可以使用parts.type_id IN(1,2,4)。它與列出的ORs一樣工作,但更易於閱讀。

5

爲確保它具有與沒有連接相同的行數,請使用左外連接

http://dev.mysql.com/doc/refman/5.0/en/join.html

例如:

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts 
LEFT JOIN serialized_parts sp 
ON sp.parts_id = parts.id 
WHERE (parts.type_id=1 OR parts.type_id=2 OR parts.type_id=4) 
ORDER BY parts.type_id 

加入的默認類型是內連接。在內部連接上,如果表A和表B中的連接字段之間沒有匹配,則不會顯示錶A和表B的內容。最有可能的情況是零件表中有六行,沒有serilized_parts行,其parts_id與零件行的id匹配。如果是這種情況,則執行左外部聯接將顯示沒有serialized_parts行的行以匹配它們,通過將sp.parent_unit顯示爲NULL

+1

這也是我的猜測,另一個表沒有一個記錄匹配每個記錄inteh第一個表。 – HLGEM 2010-06-08 19:25:17

0

試試這個:

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts 
LEFT JOIN serialized_parts sp ON sp.parts_id = parts.id 
WHERE parts.type_id IN (1,2,4) 
ORDER BY parts.type_id 

消除或與IN子句,這是簡單的閱讀和理解,並使用長的形式加入其中清楚什麼聯接子句中使用的和什麼是用在哪裏。

0

看到我正在開發設置的工作,我的數據庫有點混亂,從我以前測試的東西和行丟失。

相關問題