>데이터 베이스 >MySQL 튜토리얼 >다대다 관계에서 특정 스포츠 세트가 포함된 제안을 쿼리하는 방법은 무엇입니까?

다대다 관계에서 특정 스포츠 세트가 포함된 제안을 쿼리하는 방법은 무엇입니까?

DDD
DDD원래의
2025-01-05 07:20:44925검색

How to Query for Offers Containing a Specific Set of Sports in a Many-to-Many Relationship?

SQL 오류: 제안 및 스포츠 필터에 대한 "조인된 집합은 모든 값을 포함해야 하지만 더 많은 값을 포함할 수 있습니다"

데이터베이스에는 세 개의 테이블이 있습니다: 제안, sports 및 조인 테이블 presents_sports. 지정된 스포츠가 모두 있어야 하지만 추가 스포츠도 포함될 수 있다는 요구 사항에 따라 특정 스포츠 세트를 포함하는 제안을 검색하려고 합니다.

예를 들어 다음 제안을 고려하세요.

  • 라이트 : 요가, 보디보드
  • 미디엄 : 요가, 보디보드, 서핑
  • 전체 : 요가, 보디보딩, 서핑, 패러세일링, 스카이다이빙

"보디보딩" 및 "서핑"이 포함된 제안을 쿼리하는 경우 "중간"과 "모두"를 모두 수신하지만 "경량"은 수신하지 않을 것으로 예상합니다. 그러나 현재 쿼리는 다음과 같습니다.

Offer.joins(:sports)
     .where(sports: { name: ["Bodyboarding", "Surfing"] })
     .group("sports.name")
     .having("COUNT(distinct sports.name) = 2")

그리고 해당 SQL은 다음과 같습니다.

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;

결과를 반환하지 않습니다.

이를 수정하기 위해 쿼리를 그룹화 기준으로 수정합니다. 스포츠 이름 대신 제안 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;

또는 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

이 수정을 통해 결과를 적절하게 그룹화하고 필요한 필터링 기준을 적용하여 지정된 스포츠를 포함하는 원하는 제안을 검색할 수 있습니다.

위 내용은 다대다 관계에서 특정 스포츠 세트가 포함된 제안을 쿼리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.