如何获取分组行的ID?附数据表与SQL查询片段
如何获取分组行的ID
看起来你是想在分组查询时拿到对应行的ID对吧?结合你给出的notifications表结构,我给你几种常见场景的解决方案:
场景1:分组后获取每组的所有ID(逗号拼接)
如果你想按某个字段(比如user_id)分组,同时拿到该组下所有的id,可以用MySQL的GROUP_CONCAT()函数来实现:
SELECT user_id, GROUP_CONCAT(id SEPARATOR ',') AS group_ids, SUM(money) AS total_money -- 可选,顺便计算每组的总金额 FROM notifications WHERE belongs_to_user_id = 101 -- 你的示例数据里都是101,可按需调整条件 GROUP BY user_id;
执行后,比如user_id=123对应的group_ids就是1,2,6,清晰展示该组下的所有ID。
场景2:分组后获取每组的特定ID(最小/最大ID)
如果只需要每组里最早的ID(最小id)或者最晚的ID(最大id),用MIN()或MAX()聚合函数就可以:
SELECT user_id, MIN(id) AS first_id, -- 分组内最小的ID,也就是最早创建的那条 MAX(id) AS last_id, -- 分组内最大的ID,也就是最晚创建的那条 SUM(money) AS total_money FROM notifications WHERE belongs_to_user_id = 101 GROUP BY user_id;
比如user_id=123的first_id是1,last_id是6,满足你只需要分组内首尾ID的需求。
场景3:保留分组聚合结果,同时关联原表获取所有行ID
如果你想把分组后的聚合数据(比如每个帖子的总金额)和原表的每一行ID对应起来,可以用子查询关联的方式:
SELECT n.id, n.post_id, n.user_id, n.money, post_total.total_money FROM notifications n JOIN ( SELECT post_id, SUM(money) AS total_money FROM notifications WHERE belongs_to_user_id = 101 GROUP BY post_id ) post_total ON n.post_id = post_total.post_id WHERE belongs_to_user_id = 101;
这个查询会返回每一行的ID,同时带上对应post_id的总金额,适合需要明细+聚合数据的场景。
场景4:用窗口函数标记分组内的ID(MySQL 8.0+适用)
如果你的MySQL版本是8.0及以上,窗口函数会更灵活。比如给每个分组内的ID排序,或者直接拿到分组的第一个ID:
SELECT id, user_id, money, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY id) AS row_num, -- 分组内行号 FIRST_VALUE(id) OVER(PARTITION BY user_id ORDER BY id) AS group_first_id -- 分组第一个ID FROM notifications WHERE belongs_to_user_id = 101;
这里group_first_id会显示每个user_id分组里的第一个ID,row_num可以帮你区分分组内的行顺序。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

