PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

SQL trong đó tập hợp đã nối phải chứa tất cả các giá trị nhưng có thể chứa nhiều giá trị hơn

Nhóm theo offer.id , không phải bởi sports.name (hoặc 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;

Giả sử cách triển khai điển hình:

  • offer.idsports.id được định nghĩa là khóa chính.
  • sports.name được xác định là duy nhất.
  • (sport_id, offer_id) trong offers_sports được xác định là duy nhất (hoặc PK).

Bạn không cần DISTINCT trong số đếm. Và count(*) thậm chí còn rẻ hơn một chút.

Câu trả lời liên quan với kho các kỹ thuật khả thi:

  • Cách lọc kết quả SQL theo quan hệ có nhiều lần

Được thêm bởi @max (OP) - đây là truy vấn ở trên được đưa vào 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. Cơ sở dữ liệu mặc định có tên là postgres trên máy chủ Postgresql

  2. Postgres - Hàm trả về giao điểm của 2 ĐƯỜNG LÊN?

  3. [Video] Tích hợp dữ liệu với PostgreSQL

  4. PostgreSQL có thể lập chỉ mục các cột mảng không?

  5. jsonb so với jsonb [] cho nhiều địa chỉ cho một khách hàng