三張表:
zd_product:商品表 (zp_id PK, inputtime 發布時間)zd_order:訂單表 (zo_id PK, zp_id FK, zo_voer_time 完成時間)zd_ord_pro:訂單商品關聯表 (zo_id FK, zp_id FK)需求:找出發布後 30 天內 完全無銷售記錄 的商品。
SELECT p.*
FROM zd_product p
WHERE p.zp_id NOT IN (
SELECT DISTINCT o.zp_id
FROM zd_order o
JOIN zd_ord_pro op ON o.zo_id = op.zo_id
WHERE o.zo_voer_time > p.inputtime
AND o.zo_voer_time < DATE_ADD(p.inputtime, INTERVAL 30 DAY)
);
DATE_ADD 做日期運算,避免時間戳轉換效能損耗DISTINCT 減少子查詢返回行數NOT IN 邏輯清晰,注意子查詢結果含 NULL 時語義變化(此場景 zp_id 非空安全)zd_order.zo_voer_time、zd_product.inputtime 有索引SELECT p.*
FROM zd_product p
LEFT JOIN (
SELECT DISTINCT o.zp_id
FROM zd_order o
JOIN zd_ord_pro op ON o.zo_id = op.zo_id
WHERE o.zo_voer_time > p.inputtime
AND o.zo_voer_time < DATE_ADD(p.inputtime, INTERVAL 30 DAY)
) sold ON p.zp_id = sold.zp_id
WHERE sold.zp_id IS NULL;
在某些版本中 JOIN 寫法執行計劃更優,建議 EXPLAIN 對比。
提示:原文 SQL 未驗證,上述為重構優化版,實際上線前請在測試庫驗證執行計劃與結果正確性。