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

如何获取分组行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:03:02