MySQL多条件IN查询仅返回单条结果问题排查
问题分析与解决:多手机号IN查询仅返回一条结果
核心问题是你没有添加GROUP BY子句。当使用GROUP_CONCAT这类聚合函数时,MySQL在未指定分组规则的情况下,会将整个结果集合并为单个分组处理,因此无论匹配到多少个用户,最终只会返回一行聚合结果。单独查询单个手机号时,结果集本身只有一组数据,所以表现正常;但传入多个手机号时,所有用户的记录被强行聚合为一行,导致只返回一条结果。
另外原SQL的GROUP_CONCAT没有排序逻辑,取到的第一个ID是随机的,无法保证是最新条目,这也是需要修正的点。
修改后的SQL
SELECT users.id, MAX(user_refs.is_active) AS is_active, SUBSTRING_INDEX(GROUP_CONCAT(user_bookings.id ORDER BY user_bookings.id DESC), ',', 1) AS user_bookings_Id, SUBSTRING_INDEX(GROUP_CONCAT(user_cancels.id ORDER BY user_cancels.id DESC), ',', 1) AS user_cancels_Id, SUBSTRING_INDEX(GROUP_CONCAT(user_stays.id ORDER BY user_stays.id DESC), ',', 1) AS user_stays_Id FROM users LEFT JOIN user_refs ON user_refs.user_id = users.id LEFT JOIN user_bookings ON user_bookings.user_id = users.id AND user_bookings.user_bookings_status IN ('RECEIVED', 'PENDING', 'COMPLETED') AND user_bookings.is_active = 1 LEFT JOIN user_cancels ON user_cancels.user_id = users.id AND user_cancels.status IN ('RECEIVED', 'PENDING', 'COMPLETED', 'REVIEWED', 'OPEN') LEFT JOIN user_stays ON user_stays.user_id = users.id AND user_stays.status IN ('ONGOING', 'PENDING', 'COMPLETED') WHERE users.contact_number IN ("95600014545", "6560001004", "7672356444") GROUP BY users.id;
关键修改说明
- 新增
GROUP BY users.id:强制按用户ID分组,每个用户的记录独立聚合,确保每个手机号对应一行结果 GROUP_CONCAT添加排序:通过ORDER BY ... DESC保证取到的是最新的条目ID(假设ID为自增主键,倒序即最新)- OR条件替换为IN:简化SQL结构,提升可读性和维护性
user_refs.is_active用MAX聚合:若单个用户存在多条user_refs记录,确保能取到有效状态值(一对一关系下不影响结果)
内容的提问来源于stack exchange,提问作者Maya
相关产品推荐
相关产品推荐

