offer.id
. द्वारा समूहित करें , sports.name
. द्वारा नहीं (या sports.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;
सामान्य कार्यान्वयन को मानते हुए:
offer.id
औरsports.id
प्राथमिक कुंजी के रूप में परिभाषित हैं।sports.name
अद्वितीय परिभाषित किया गया है।(sport_id, offer_id)
offers_sports
. में अद्वितीय (या PK) परिभाषित किया गया है।
आपको DISTINCT
की आवश्यकता नहीं है गिनती में। और count(*)
थोड़ा सस्ता है, फिर भी।
संभावित तकनीकों के शस्त्रागार के साथ संबंधित उत्तर:
- एक हैस-मैनी-थ्रू संबंध में SQL परिणामों को कैसे फ़िल्टर करें
@max (ओपी) द्वारा जोड़ा गया - यह उपरोक्त क्वेरी 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