집 >데이터 베이스 >MySQL 튜토리얼 >다대다 관계에서 특정 스포츠 세트가 포함된 제안을 쿼리하는 방법은 무엇입니까?
데이터베이스에는 세 개의 테이블이 있습니다: 제안, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!