ホームページ > データベース > mysql チュートリアル > 多対多の関係で特定のスポーツのセットを含むオファーをクエリするにはどうすればよいですか?

多対多の関係で特定のスポーツのセットを含むオファーをクエリするにはどうすればよいですか?

DDD
リリース: 2025-01-05 07:20:44
オリジナル
913 人が閲覧しました

How to Query for Offers Containing a Specific Set of Sports in a Many-to-Many Relationship?

SQL エラー: オファーとスポーツ フィルターの「結合セットにはすべての値が含まれている必要がありますが、さらに多くの値が含まれる場合もあります」

データベースには、オファー、 sports、結合テーブル Offers_sports.指定されたすべてのスポーツが存在する必要があるという条件で、指定された一連のスポーツを含むオファーを取得したいと考えていますが、追加のスポーツも含まれる可能性があります。

たとえば、次のオファーを考慮します:

  • ライト: ヨガ、ボディボード
  • 中: ヨガ、ボディボード、サーフィン
  • すべて: ヨガ、ボディボード、サーフィン、パラセーリング、スカイダイビング

「ボディボード」と「サーフィン」を含むオファーをクエリすると、「中」と「すべて」の両方が返されると予想されますが、「ライト」は返されません。ただし、現在のクエリ:

Offer.joins(:sports)
     .where(sports: { name: ["Bodyboarding", "Surfing"] })
     .group("sports.name")
     .having("COUNT(distinct sports.name) = 2")
ログイン後にコピー

および同等の SQL:

SELECT "offers".* 
FROM "offers" 
INNER JOIN "offers_sports" ON "offers_sports"."offer_id" = "offers"."id"     
INNER JOIN "sports" ON "sports"."id" = "offers_sports"."sport_id" 
  WHERE "sports"."name" IN ('Bodyboarding', 'Surfing') 
GROUP BY sports.name 
HAVING COUNT(distinct sports.name) = 2;
ログイン後にコピー

結果が返されません。

これを修正するには、グループ化するようにクエリを変更します。スポーツ名の代わりにオファー ID:

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;
ログイン後にコピー

または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
ログイン後にコピー

この変更により、結果を適切にグループ化し、必要なフィルタリング基準を適用して、指定されたスポーツを含む希望のオファーを取得できるようになります。

以上が多対多の関係で特定のスポーツのセットを含むオファーをクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート