業務場景
enet_wall_list:參與抽獎用戶表(同一用戶可能多條記錄)
enet_wall_lottery:中獎用戶表
- 需求:找出「參與了但未中獎」的所有用戶
核心 SQL
SELECT *
FROM `enet_wall_list` AS l
LEFT JOIN `enet_wall_lottery` AS lottery
ON l.openid = lottery.openid
WHERE l.weid = 63
AND lottery.id IS NULL
GROUP BY l.openid;
原理解析
LEFT JOIN 保留左表所有行
- 右表無匹配時,右表列全部為
NULL
lottery.id IS NULL 精準過濾出「無中獎記錄」的用戶
GROUP BY openid 去重(同一用戶多次參與)
通用模板
-- 查詢 A 表存在、B 表不存在的記錄
SELECT *
FROM `A` a
LEFT JOIN `B` b ON a.pid = b.pid
WHERE b.pid IS NULL
AND LENGTH(a.pid) < 10; -- 額外業務過濾
知識點補充
LEFT JOIN:左表為主表,每行必出現;右表無匹配填 NULL
LENGTH(str):計算字符串字節長度(非字符數)
- 對比
NOT IN/NOT EXISTS:LEFT JOIN + IS NULL 在大數據量下通常性能更優,且語義清晰