私のデータベースにはこの単純な構造があります
リーリー種 A と種 B は、情報の重複を防ぐために複合固有であることを指摘したいと思います。たとえば、データベースに 5 つの種しかない場合、互換性テーブルは次のようになります:
リーリー指定された種のリストから相互に完全に互換性のある種のリストを返すクエリを作成する必要があります。つまり、結果のリスト内のすべての種は、提供されたリスト内のすべての種と互換性がある必要があります。提供された種は結果リストに表示されてはなりません。
次のクエリを試しましたが、指定された種の少なくとも 1 つと互換性のある種のみが返されました:
リーリーこのクエリを変更して、相互に完全に互換性のある種のリストを取得するにはどうすればよいですか?
上記のクエリの場合、期待される結果は種 4 のみを含む種リストになるはずです。種 1、2、3 は提供されたリストから除外され、5 は種 1 および 2 との適合性がないため除外する必要があります。
助けやアドバイスをいただければ幸いです。ありがとう!
この問題は、フィルタリングと集計によって解決できます。
リーリーサブクエリは、参照種 (
ref
) と互換性のある種 (spec
) を 2 つの異なる列に配置します。次に、関心のある 3 つの参照種をフィルタリングして、互換性のある種ごとにグループ化し、最終的にhaving
句に正確に一致するグループを保持します。種の名前も知りたい場合は、
リーリー参加できます
:DB フィドル デモ
これには、互換性 = 1 で明示的にリンクされている種のみが含まれます (つまり、種はデフォルトで互換性がないと想定されます)
リーリーこれには、互換性 = 0 に明示的に関連付けられた種を除くすべての種が含まれます (つまり、種はデフォルトで互換性があると想定されます)
リーリーこれらのどちらがロジックに適しているかにかかわらず、クエリのパフォーマンスを最適化するために、
compatibility.speciesA
列とcompatibility.speciesB
列にインデックスを追加することをお勧めします。 p>