ホームページ > データベース > mysql チュートリアル > SQL 結合を使用して、指定された値のセット (場合によってはそれ以上) をすべて含むレコードを取得する方法

SQL 結合を使用して、指定された値のセット (場合によってはそれ以上) をすべて含むレコードを取得する方法

Linda Hamilton
リリース: 2024-12-17 14:35:12
オリジナル
841 人が閲覧しました

How to Retrieve Records Containing All of a Given Set of Values (But Potentially More) Using SQL Joins?

結合セットにはすべての値が含まれている必要がありますが、さらに多くの値が含まれる可能性がある SQL

リレーションシップを持つテーブルのセットが与えられた場合、目標はレコードを取得することです指定された値の配列を含む 1 つのテーブル (オファー) から、追加の値も含まれる可能性があります。

SQL では、これを使用して実現できます。結合、グループ化、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;
ログイン後にコピー

考慮事項:

  • オファー テーブルの主キー (o.id) は、グループ化に使用されます。各オファーが 1 回カウントされるようにします。
  • GROUP BY を使用すると、DISTINCT を使用せずにレコードを集計できます。 count 操作。
  • HAVING 句は、グループ化された結果をフィルタリングして、目的の基準 (この場合は 2 つの特定のスポーツ) を満たすオファーのみを含めます。

ActiveRecord の実装:

def self.includes_sports(*sport_names)
  joins(:sports)
    .where(sports: { name: sport_names })
    .group('offers.id')
    .having("count(*) = ?", sport_names.size)
end
ログイン後にコピー

このメソッドを使用すると、指定されたスポーツ名を含むオファーをクエリできます。 ActiveRecord 内:

offers = Offer.includes_sports("Bodyboarding", "Surfing")
ログイン後にコピー

以上がSQL 結合を使用して、指定された値のセット (場合によってはそれ以上) をすべて含むレコードを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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