2009-10-02 48 views
0

我有一次旅行,有許多居住地。我需要一個單一的查詢,返回沒有指定居住地信息的所有行程。和所有符合特定居住條件的旅行。對連接表中沒有鍵的所有記錄以及具有匹配鍵的所有記錄的單個查詢

我可以從該查詢第一:

SELECT * FROM `trips` WHERE (((NOT EXISTS (SELECT id FROM residencies WHERE trips.id = residencies.trip_id)) 

但要獲得第二,我需要添加此位和:

INNER JOIN `residencies` ON (`trips`.`id` = `residencies`.`trip_id`) 

添加之前加入WHERE子句要求具有居住ID和沒有居住ID的結果。這顯然沒有任何回報。那麼我怎麼寫這個來獲得一個查詢中的完整結果集呢?存儲過程是不允許的。

我正在使用Rails,因此如果答案是Rails特有的,那麼這是獎金(但絕對不是必需的)。如果有人能夠證明searchlogic插件如何做到這一點,那麼這是一項巨大的好處。

目前,我有一個名爲範圍的第一個要求:

Trip.named_scope :residencies_empty, :conditions => ['NOT EXISTS (SELECT id FROM residencies WHERE trips.id = residencies.trip_id)'] 

第二個要求是可以通過searchlogic:

Trip.residences_id_equals(id) 

理想的解決方案將是一個searchlogic範圍,看起來像這樣:

Trip.residencies_null_or_residencies_id_equals(id) 
+0

您可以發佈旅行和居住表的定義嗎? – 2009-10-02 17:24:26

回答

0

我建議使用另一種「存在」針對與特定居住的車次:

SELECT * FROM `trips` WHERE 
    (NOT EXISTS (SELECT id FROM residencies WHERE trips.id = residencies.trip_id)) 
    OR 
    (EXISTS (SELECT id FROM residencies WHERE trips.id = residencies.trip_id 
      AND other_criteria_for_specific_residency) 
) 

這似乎是最可讀的解決方案,但如果性能是很重要的,你應該檢查EXPAIN,看看這是怎麼優化(與MySql中最複雜的查詢一樣)。

+0

謝謝Tomas!我在這個問題上敲了幾個小時! – Gavin 2009-10-03 02:09:04

0

TRY:

SELECT * FROM `trips` 
    LEFT JOIN residencies ON trips.id = residencies.trip_id 

你會從trips得到的所有列的數據,但數據將只列從那裏一排的存在,如果沒有住院醫生行存在的那些列將是空的駐填充。

+0

from http://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join表A和B的左外連接(或簡單的左連接)的結果總是包含「左」表的所有記錄(A ),即使連接條件在「右」表(B)中找不到任何匹配的記錄。這意味着如果ON子句匹配B中的0(零)記錄,則連接仍然會在結果中返回一行 - 但B中每列的NULL都爲NULL。 – 2009-10-02 17:34:55

0

您是否嘗試過使用UNION來合併兩個查詢的結果?

相關問題