ホームページ >データベース >mysql チュートリアル >SQL で指定されたスポーツのセットをすべて含むオファーを選択するにはどうすればよいですか?

SQL で指定されたスポーツのセットをすべて含むオファーを選択するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 18:23:11309ブラウズ

How to Select Offers Containing All of a Specified Set of Sports in SQL?

「結合セットにはすべての値が含まれている必要がありますが、さらに多くの値が含まれる可能性がある 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。