私は3つのテーブルoffers
,sports
と結合テーブルoffers_sports
を持っています。私が選択したい結合されたセットはすべての値を含む必要がありますが、より多く含むことがあります
class Offer < ActiveRecord::Base
has_and_belongs_to_many :sports
end
class Sport < ActiveRecord::Base
has_and_belongs_to_many :offers
end
はがスポーツ名の指定された配列が含まれていることを提供しています。彼らははsports
のすべてを含むが、でなければならないが、はがさらにある。
light:
- "Yoga"
- "Bodyboarding"
medium:
- "Yoga"
- "Bodyboarding"
- "Surfing"
all:
- "Yoga"
- "Bodyboarding"
- "Surfing"
- "Parasailing"
- "Skydiving"
は、私がmedium
とall
ではなくlight
を取得したい配列["Bodyboarding", "Surfing"]
を考える:
は、私はこれら三つのオファーを持っているとしましょう。
私はthis answerの線に沿って何かを試してみましたが、私は結果にゼロ行を取得:
SQLに翻訳Offer.joins(:sports)
.where(sports: { name: ["Bodyboarding", "Surfing"] })
.group("sports.name")
.having("COUNT(distinct sports.name) = 2")
:
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;
のActiveRecordの答えはいいだろうが、私'LL Postgresと互換性があるSQLだけを解決してください。
データ:offer.id
によって、ないsports.name
(又はsports.id
)によって
offers
======================
id | name
----------------------
1 | light
2 | medium
3 | all
4 | extreme
sports
======================
id | name
----------------------
1 | "Yoga"
2 | "Bodyboarding"
3 | "Surfing"
4 | "Parasailing"
5 | "Skydiving"
offers_sports
======================
offer_id | sport_id
----------------------
1 | 1
1 | 2
2 | 1
2 | 2
2 | 3
3 | 1
3 | 2
3 | 3
3 | 4
3 | 5
4 | 3
4 | 4
4 | 5
SQLは機能しますか?それは正しいように見えます。 –
0行を返します。 @GordonLinoff – max
あなたはすでにそこにいます:「オファー」フィールドでグループ化してください(明示的なフィールド名で*を置き換え、グループ内のフィールド名を繰り返す)。あなたは今、sports.nameでグループ分けしています。もちろん、sports.nameごとのsports.nameの個数は常に1です。 –