> 데이터 베이스 > MySQL 튜토리얼 > 다대다관계에서 여러 클럽에 속한 학생을 효율적으로 필터링하는 방법은 무엇입니까?

다대다관계에서 여러 클럽에 속한 학생을 효율적으로 필터링하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-23 21:31:10
원래의
1000명이 탐색했습니다.

How to Efficiently Filter Students Belonging to Multiple Clubs in a Has-Many-Through Relationship?

다대통행 관계에서 SQL 결과 필터링: 실용 가이드

다중 연결 관계가 있는 테이블 전체에서 효율적으로 데이터를 쿼리하는 것은 데이터베이스 성능에 매우 중요합니다. 세 개의 테이블이 포함된 일반적인 시나리오를 예로 들어 보겠습니다.

  • student (ID, 이름)
  • club (ID, 이름)
  • student_club (학생_ID, 클럽_ID)

과제: 축구(club_id 30)와 야구(club_id 50) 클럽 모두의 회원인 학생을 식별하세요.

Simple JOIN이 실패하는 이유:

조인을 사용하는 순진한 접근 방식은 효과적이지 않습니다.

<code class="language-sql">SELECT student.*
FROM student
INNER JOIN student_club sc ON student.id = sc.student_id
LEFT JOIN club c ON c.id = sc.club_id
WHERE c.id = 30 AND c.id = 50;</code>
로그인 후 복사

단일 club 레코드는 id = 30id = 50을 동시에 가질 수 없기 때문에 실패합니다.

효과적인 솔루션:

1. 중첩된 IN 쿼리:

이 접근 방식은 두 개의 하위 쿼리를 사용하여 각 클럽의 학생을 찾은 다음 결과를 교차시킵니다.

<code class="language-sql">SELECT student.*
FROM student
WHERE student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 30
) AND student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 50
);</code>
로그인 후 복사

이 방법은 대규모 데이터 세트의 경우에도 일반적으로 효율적입니다.

2. INTERSECT 사용:

INTERSECT 연산자는 보다 간결한 솔루션을 제공합니다.

<code class="language-sql">SELECT student.*
FROM student
WHERE student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 30
)
INTERSECT
SELECT student.id
FROM student
WHERE student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 50
);</code>
로그인 후 복사

INTERSECT은 두 하위 쿼리 모두에서 공통 학생 ID만 반환하여 두 클럽의 학생을 효과적으로 식별합니다. 이 접근 방식과 중첩 IN 접근 방식 간의 선택은 데이터베이스 시스템 기본 설정 및 쿼리 최적화 프로그램 동작에 따라 달라지는 경우가 많습니다. 일반적으로 두 가지 모두 이 작업에 효율적입니다.

위 내용은 다대다관계에서 여러 클럽에 속한 학생을 효율적으로 필터링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿