首頁 >資料庫 >mysql教程 >如何有效率地過濾屬於多俱樂部的多俱樂部學生?

如何有效率地過濾屬於多俱樂部的多俱樂部學生?

Linda Hamilton
Linda Hamilton原創
2025-01-23 21:31:101021瀏覽

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)俱樂部成員的學生。

為什麼簡單的 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn