PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQL जहां शामिल हुए सेट में सभी मान होने चाहिए लेकिन अधिक हो सकते हैं

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कॉलम स्टोर प्लान

  2. टाइपकास्ट स्ट्रिंग से पूर्णांक

  3. टाइमज़ोन ऑफ़सेट के साथ दिनांक प्राप्त करना

  4. प्रमाणीकरण प्रणाली के साथ PostgreSQL को एकीकृत करना

  5. PostgreSQL में एक स्ट्रिंग और एक संख्या को संयोजित करें