「結合セットにはすべての値が含まれている必要がありますが、さらに多くの値が含まれる可能性がある SQL」
要件の理解
3 つの関連テーブル: Offers、sports、offers_sports を介して結合されたものについて考えます。多くの関係を持っています。目標は、指定されたスポーツの配列を含むオファーを選択することです。オファーには指定されたすべてのスポーツが含まれている必要がありますが、追加のスポーツが含まれる場合もあります。
潜在的な解決策
1この方法では、JOIN、WHERE、GROUP BY、および HAVING 句を組み合わせて使用し、必要な条件に基づいて結果をフィルタリングします。具体的には:
SELECT o.* FROM sports s JOIN offers_sports os ON os.sport_id = s.id JOIN offers o ON os.offer_id = o.id WHERE s.name IN ('Bodyboarding', 'Surfing') GROUP BY o.id HAVING count(*) = 2;
このクエリは、まず 3 つのテーブルを結合して、オファーとそれに関連するスポーツを取得します。 WHERE 句は、指定された名前のスポーツに検索を制限します。 GROUP BY 句は結果をオファー ID ごとにグループ化し、HAVING 句は指定されたすべてのスポーツを含むオファーのみが選択されるようにします。
ActiveRecord の実装の改善
提供された ActiveRecordソリューションをさらに改良して効率を高めることができます:
class Offer < ActiveRecord::Base has_and_belongs_to_many :sports def self.includes_sports(*sport_names) joins(:sports) .where(sports: { name: sport_names }) .group('offers.id') .having("count(*) = ?", sport_names.size) end end
このメソッドはチェーンを使用して必要な処理を実行します。 JOIN、WHERE、GROUP BY、HAVING などの操作を 1 つのクエリで実行できます。また、疑問符 (?) プレースホルダーを使用して期待されるカウント値を動的に渡すことにより、HAVING 句を簡素化します。
以上がSQL で指定されたスポーツのセットをすべて含むオファーを選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。