You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:03:25