SQL查询:从表A提取不在表B中的指定条件的user_id与phone_number
解决方案:获取符合条件的去重用户ID和手机号
首先,我们来明确你的核心需求:从表trxns(即你提到的表A)中提取去重的memid(用户ID)和phone_number,需同时满足以下条件:
phone_number以指定前缀(233703/06/07/04)开头dateadded处于2018-01-18至2018-08-18的时间范围内- 该用户ID(
memid)不存在于tickets表(表B)的pid字段中
现有查询的问题
你的当前查询存在几个关键问题:
- 字段名不匹配:表结构定义的是
phone_number,但查询中误用了phonenum - 错误关联了表B的手机号条件:我们只需要过滤表A的手机号,无需判断表B的手机号前缀
- 返回字段不符合需求:你需要的是
user_id和phone_number,但当前仅返回了手机号 - 逻辑冗余:
LEFT JOIN后的条件判断可以更精准
正确的SQL查询
如果你的SQL方言支持IN搭配通配符,推荐使用更简洁的写法:
SELECT DISTINCT a.memid AS user_id, a.phone_number FROM trxns a LEFT JOIN tickets b ON a.memid = b.pid WHERE a.dateadded BETWEEN '2018-01-18' AND '2018-08-18' AND a.phone_number LIKE ANY ('233703%', '233706%', '233707%', '233704%') AND b.pid IS NULL;
若你的SQL环境不支持LIKE ANY,可改用OR连接多个条件:
SELECT DISTINCT a.memid AS user_id, a.phone_number FROM trxns a LEFT JOIN tickets b ON a.memid = b.pid WHERE a.dateadded BETWEEN '2018-01-18' AND '2018-08-18' AND ( a.phone_number LIKE '233703%' OR a.phone_number LIKE '233706%' OR a.phone_number LIKE '233707%' OR a.phone_number LIKE '233704%' ) AND b.pid IS NULL;
结果验证
执行上述查询后,会得到你预期的结果:
| user_id | phone_number |
|---|---|
| 3 | 2337030299931 |
这是因为只有表A中用户3的记录满足所有条件:手机号前缀为233703,日期在指定范围内,且用户ID 3未出现在表B的pid列表中。
内容的提问来源于stack exchange,提问作者Adewale Shotobi
相关产品推荐
相关产品推荐

