집 >데이터 베이스 >MySQL 튜토리얼 >SQL에서 지정된 스포츠 세트가 모두 포함된 제안을 선택하는 방법은 무엇입니까?
"조인된 집합에 모든 값이 포함되어야 하지만 더 많은 값이 포함될 수 있는 SQL"
요구 사항 이해
세 가지 관련 테이블인 Offers, Sports 및 Offers_sports를 고려해 보세요. has_and_belongs_to_many 관계. 목표는 지정된 스포츠 배열을 포함하는 제안을 선택하는 것입니다. 여기서 제안에는 지정된 모든 스포츠가 포함되어야 하지만 추가 스포츠가 포함될 수 있습니다.
잠재적 솔루션
One 접근 방식은 JOIN, WHERE, GROUP BY 및 HAVING 절의 조합을 사용하여 필수 조건에 따라 결과를 필터링하는 것입니다. 구체적으로:
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;
이 쿼리는 먼저 세 개의 테이블을 조인하여 제안 및 관련 스포츠를 검색합니다. WHERE 절은 지정된 이름을 가진 스포츠로 검색을 제한합니다. GROUP BY 절은 제안 ID별로 결과를 그룹화하고 HAVING 절은 지정된 모든 스포츠를 포함하는 제안만 선택되도록 보장합니다.
향상된 ActiveRecord 구현
제공된 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
이 방법은 연결을 사용하여 필요한 작업을 수행합니다. 단일 쿼리에서 JOIN, WHERE, GROUP BY 및 HAVING을 포함한 작업을 수행할 수 있습니다. 또한 예상 개수 값을 동적으로 전달하기 위해 물음표(?) 자리 표시자를 사용하여 HAVING 절을 단순화합니다.
위 내용은 SQL에서 지정된 스포츠 세트가 모두 포함된 제안을 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!