首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 多條件查詢結果集取交集實現方案:臨時表、CROSS JOIN、子查詢三種模式對比

     編輯:MySQL 綜合教學

業務場景

入學批次、層次、專業多選時,課程下拉框需顯示「所有選中專業共有的課程」(交集)。

方案一:臨時表 + WHERE 等值連接

StringBuilder sql = new StringBuilder("SELECT model FROM ");
for (int i=0; i 1) {
    for (int i=1; i

方案二:CROSS JOIN + ON 條件

StringBuilder sql = new StringBuilder("SELECT model FROM ");
for (int i=0; i 1) {
    for (int i=1; i

方案三:子查詢 / INTERSECT(MySQL 8.0+ 支援 INTERSECT)

-- MySQL 8.0+
SELECT model FROM TeachingPlan_CourseDetail WHERE specialId = :sid1
INTERSECT
SELECT model FROM TeachingPlan_CourseDetail WHERE specialId = sid2
INTERSECT ...;

-- 老版本用 EXISTS/IN 模擬
SELECT model FROM TeachingPlan_CourseDetail t1
WHERE specialId = :sid1
  AND EXISTS (SELECT 1 FROM TeachingPlan_CourseDetail t2 WHERE t2.model = t1.model AND t2.specialId = :sid2)
  AND EXISTS ...;

對比建議

方案優點缺點適用版本
臨時表 + WHERE兼容性好,邏輯直觀SQL 動態拼接複雜,需別名管理全版本
CROSS JOIN + ON語義清晰,優化器友好大數據集 Cartesian Product 風險全版本
INTERSECT標準 SQL、簡潔、性能佳需 MySQL 8.0+8.0+
EXISTS 子查詢兼容舊版,索引友好多專業時 SQL 膨脹全版本

最佳實踐

  • 專業數固定少:INTERSECT 或 EXISTS
  • 專業數動態多:應用層先查各專業課程 ID 集合,內存取交集,再 IN (...) 查詢詳情
  • 避免巨大 CROSS JOIN 產生笛卡爾積
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved