我有一个有很多住所的旅行。我需要一个查询来返回未指定居住信息的所有旅行。以及与指定居住地相匹配的所有旅行。
我可以从这个查询中得到第一个:
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)