0

私は多くの居住者がいる旅行をしています。居住情報が指定されていないすべての旅行を返す単一のクエリが必要です。指定された居住地に一致するすべての旅行。

このクエリから最初のものを取得できます。

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

しかし、2 番目を取得するには、次のビットも追加する必要があります。

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

WHERE 句の前に結合を追加すると、居住者 ID があり、居住者 ID がない結果が求められます。それは明らかに何も返しません。では、1 つのクエリで完全な結果セットを取得するには、これをどのように記述すればよいでしょうか? これでは、ストアド プロシージャは許可されていません。

私はRailsを使用しているので、答えがRails固有のものであればボーナスです(ただし必須ではありません)。そして、誰かが searchlogic プラグインでこれを行う方法を示すことができれば、大きなボーナスです。

現在、名前付きスコープとして最初の要件があります。

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

2 番目の要件は、searchlogic から入手できます。

Trip.residences_id_equals(id)

理想的な解決策は、次のような searchlogic スコープです。

Trip.residencies_null_or_residencies_id_equals(id)
4

3 に答える 3

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 に答える
0

試す:

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

からすべての列のデータを取得しますがtrips、データは、行が存在する居住者の列にのみ入力されます。居住者の行が存在しない場合、それらの列は null になります。

于 2009-10-02T17:20:50.943 に答える
0

UNIONを使用して 2 つのクエリの結果を結合しようとしましたか?

于 2009-10-02T17:27:32.007 に答える