業務需求:找出發布一個月內**從未售出**的商品。涉及三表:
zd_product:商品表,主鍵 zp_id,發布時間 inputtimezd_order:訂單表,主鍵 zo_id,外鍵 zp_id,完成時間 zo_voer_timezd_ord_pro:訂單商品關聯表,zo_id、zp_idNOT IN)SELECT *
FROM zd_product a1
LEFT JOIN zd_ord_pro a3 ON a1.zp_id = a3.zp_id
WHERE a1.zp_id NOT IN (
SELECT zp_id
FROM zd_order a2
WHERE a2.zo_voer_time > a1.inputtime
AND a2.zo_voer_time < a1.inputtime + INTERVAL 30 DAY
);
a1.inputtime,實現「每個商品以自己的發布時間為基準,向前 30 天」的動態窗口。INTERVAL 30 DAY 而非數值相加,避免時間戳/日期類型混淆。INNER JOIN 會漏掉這類商品。NOT IN 陷阱:若子查詢結果含 NULL,整個 NOT IN 返回空集。本案 zp_id 為主鍵/外鍵非空,安全。通用寫法建議改 NOT EXISTS:WHERE NOT EXISTS (
SELECT 1 FROM zd_order a2
WHERE a2.zp_id = a1.zp_id
AND a2.zo_voer_time > a1.inputtime
AND a2.zo_voer_time < a1.inputtime + INTERVAL 30 DAY
)
zd_order(zo_voer_time, zp_id) 建立聯合索引,支援時間範圍+商品 ID 查詢zd_product(inputtime) 建立索引,加速發布時間篩選