MySQL如何按ID出现次数从多到少获取唯一ID
没问题,这在MySQL里用单条查询就能轻松实现,分两种常见场景给你说明:
场景1:ID存储在数据库表中
假设你的ID都存在一个表(比如叫id_records)的id字段里,直接通过分组统计+排序+字符串拼接就能搞定:
SELECT GROUP_CONCAT(id ORDER BY occurrence DESC) AS sorted_unique_ids FROM ( -- 先统计每个ID的出现次数 SELECT id, COUNT(*) AS occurrence FROM id_records GROUP BY id ) AS id_statistics;
代码拆解:
- 内层子查询
id_statistics:按ID分组,用COUNT(*)计算每个ID的出现次数,得到「ID-出现次数」的对应关系。 - 外层的
GROUP_CONCAT()函数:它会把分组后的ID拼接成逗号分隔的字符串,关键是我们在函数里加了ORDER BY occurrence DESC,强制让ID按出现次数从多到少排序后再拼接,完全符合你的需求。
场景2:ID是直接给出的逗号分隔字符串
如果你的输入是像3,1,1,2,2,2这样的原始字符串,而非存储在表中,那需要先把字符串拆分成单独的行,再重复场景1的逻辑:
SELECT GROUP_CONCAT(id ORDER BY occurrence DESC) AS sorted_unique_ids FROM ( SELECT id, COUNT(*) AS occurrence FROM ( -- 把逗号分隔的字符串拆分成每行一个ID SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('3,1,1,2,2,2', ',', num), ',', -1) AS id FROM ( -- 生成足够多的连续数字,数量要≥输入字符串里的ID总数 SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 ) AS number_sequence -- 确保只拆分到字符串里实际的ID数量,避免多余空行 WHERE num <= LENGTH('3,1,1,2,2,2') - LENGTH(REPLACE('3,1,1,2,2,2', ',', '')) + 1 ) AS split_id_rows GROUP BY id ) AS id_statistics;
代码拆解:
- 最内层的
number_sequence:生成连续数字,用来逐个定位字符串里的每个ID。 - 中间的
split_id_rows:通过两次SUBSTRING_INDEX调用,把每个ID从原始字符串中单独提取出来,变成一行一个ID的格式。 - 后续步骤和场景1一致:统计每个ID的出现次数,再按次数倒序拼接成结果字符串。
内容的提问来源于stack exchange,提问作者VASIS
相关产品推荐
相关产品推荐

