2009-10-02 51 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来合并两个查询的结果?

相关问题