MySQL查询:找出去年存在但今年未注册的用户
问题排查与正确SQL写法
原SQL的错误点
- 字段引用错误:原表无
Year字段,年份存储在MemberID中,不能直接调用A1.Year/B1.Year。 - 语法错误:
LIKE =是无效语法,需去掉等号,直接用LIKE。 - 逻辑错误:
INNER JOIN会筛选双向匹配的记录,无法排除2024年有记录的用户。B1.Name NOT LIKE "%/2024"会匹配用户其他年份的记录,导致错误关联,无法精准筛选目标用户。
- 用户标识错误:原表
ID是记录ID,不是用户唯一标识,应通过Name关联同一用户的不同年份记录。
正确SQL写法
方法一:使用NOT EXISTS子查询
SELECT DISTINCT u.Name FROM `users` u WHERE u.MemberID LIKE '%/2023' AND NOT EXISTS ( SELECT 1 FROM `users` u2 WHERE u2.Name = u.Name AND u2.MemberID LIKE '%/2024' )
方法二:使用LEFT JOIN + IS NULL
SELECT DISTINCT u2023.Name FROM `users` u2023 LEFT JOIN `users` u2024 ON u2023.Name = u2024.Name AND u2024.MemberID LIKE '%/2024' WHERE u2023.MemberID LIKE '%/2023' AND u2024.ID IS NULL
说明
DISTINCT用于去重,适配“用户每年对应多条记录”的场景。- 通过
Name关联同一用户的不同年份记录,确保检查的是同一个用户在2024年的注册情况。 - 两种写法核心逻辑一致:筛选出2023年有记录,且2024年无任何记录的用户,最终结果仅为
Dave。
内容的提问来源于stack exchange,提问作者Jasr
相关产品推荐
相关产品推荐

