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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:15