MySQL中如何移除GROUP_CONCAT结果中的max(id)或首条记录

需求说明
需要在MySQL的GROUP_CONCAT返回结果中,跳过每个分组内id最大的首条记录,原有查询语句如下:
select email, group_concat(id order by id desc) as id from api_admin.external_user group by email having count(1) > 1;
实现方法
两种常用方案,按需选择即可:
- 方案1:先过滤每个分组的最大id,再做分组拼接(稳定性更高,推荐使用)
先通过子查询拿到每个邮箱对应的最大id,关联原表把这条记录排除后,再执行分组拼接逻辑:
SELECT t1.email, GROUP_CONCAT(t1.id ORDER BY t1.id DESC) AS id FROM api_admin.external_user t1 LEFT JOIN ( SELECT email, MAX(id) AS max_id FROM api_admin.external_user GROUP BY email ) t2 ON t1.email = t2.email AND t1.id = t2.max_id WHERE t2.max_id IS NULL GROUP BY t1.email HAVING COUNT(1) > 1;
- 方案2:拼接后直接截断字符串
因为原逻辑是按id倒序拼接,第一个元素就是最大id,直接用SUBSTRING_INDEX把第一个元素截掉即可:
SELECT email, SUBSTRING_INDEX( GROUP_CONCAT(id ORDER BY id DESC), ',', -(COUNT(id) - 1) ) AS id FROM api_admin.external_user GROUP BY email HAVING COUNT(1) > 1;
注意:该方案受
GROUP_CONCAT默认长度限制影响,如果单分组内id数量过多导致拼接结果被截断,截取会出现异常,数据量大的场景优先选方案1。
内容的提问来源于stack exchange,提问作者Nauman Ilyas
相关产品推荐
相关产品推荐

