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)
4

3 回答 3

0

尝试:

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

您将从 中获取所有列中的trips数据,但数据只会填充到存在行的驻地的列中,如果不存在驻地行,则这些列将为空。

于 2009-10-02T17:20:50.943 回答
0

您是否尝试过使用UNION来组合两个查询的结果?

于 2009-10-02T17:27:32.007 回答
0

我建议在特定居住地的旅行中使用另一个“EXIST”:

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 中最复杂的查询一样)。

于 2009-10-02T18:33:05.040 回答