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

SQL技术问询:连接两张表、按列分组并获取全部列(附表结构)

连接两张表并按列分组获取全部列的解决方案

嘿,我来帮你解决这个问题!首先,你只提供了posts表的结构和数据,我先默认另一张需要关联的是创作者信息表(比如叫users,包含user_id和user_name这类字段),如果实际表名/列名不一样,你直接替换就行。

第一步:先搞定两张表的连接

要关联两张表,JOIN语句是最常用的选择。如果只想保留有匹配创作者的帖子,用INNER JOIN;要是想保留所有帖子(哪怕创作者信息缺失),就用LEFT JOIN。举个基础示例:

SELECT p.*, u.user_name
FROM posts p
JOIN users u ON p.post_creator_id = u.user_id;

第二步:按列分组并获取全部列

这里得提个关键规则:标准SQL里,GROUP BY的列必须覆盖所有非聚合的查询列,直接分组后想拿全部列容易出语法错误(有些数据库有宽松模式,但不推荐这么用,结果可能不靠谱)。根据你的需求,分两种场景处理:

场景1:按分组列聚合展示所有相关数据

比如按post_creator_id分组,把同一个创作者的所有帖子信息聚合在一起,不同数据库的聚合函数略有不同:

MySQL 示例:
SELECT 
  p.post_creator_id,
  u.user_name,
  GROUP_CONCAT(p.post_id SEPARATOR ', ') AS 帖子ID列表,
  GROUP_CONCAT(p.post_title SEPARATOR '; ') AS 帖子标题列表
FROM posts p
JOIN users u ON p.post_creator_id = u.user_id
GROUP BY p.post_creator_id, u.user_name;
PostgreSQL/SQL Server 示例(用STRING_AGG):
-- PostgreSQL
SELECT 
  p.post_creator_id,
  u.user_name,
  STRING_AGG(p.post_id::TEXT, ', ') AS 帖子ID列表,
  STRING_AGG(p.post_title, '; ') AS 帖子标题列表
FROM posts p
JOIN users u ON p.post_creator_id = u.user_id
GROUP BY p.post_creator_id, u.user_name;

-- SQL Server
SELECT 
  p.post_creator_id,
  u.user_name,
  STRING_AGG(CAST(p.post_id AS VARCHAR(10)), ', ') AS 帖子ID列表,
  STRING_AGG(p.post_title, '; ') AS 帖子标题列表
FROM posts p
JOIN users u ON p.post_creator_id = u.user_id
GROUP BY p.post_creator_id, u.user_name;

场景2:按分组列排序归类,保留每一行完整数据

如果你只是想把同一分组的数据放在一起展示,但不需要聚合,其实用ORDER BY就够了,完全不需要GROUP BY:

SELECT p.*, u.user_name
FROM posts p
JOIN users u ON p.post_creator_id = u.user_id
ORDER BY p.post_creator_id;

用你提供的posts数据测试的结果

假设users表数据是这样:

user_iduser_name
100Alice
14Bob
213Charlie
55Dave

用聚合查询会得到:

post_creator_iduser_name帖子ID列表帖子标题列表
14Bob2Good morning
55Dave4Nice...
100Alice1Hello All
213Charlie3Lovely Day

用排序查询会得到按创作者ID排序的完整行数据:

post_idpost_creator_idpost_titleuser_name
214Good morningBob
455Nice...Dave
1100Hello AllAlice
3213Lovely DayCharlie

小提醒

  • 如果你的关联表不是users,记得替换表名和JOIN的关联条件
  • 要是你确实需要GROUP BY后直接拿全部非聚合列,某些数据库可以关闭严格模式实现,但这是不规范写法,结果可能随机,非常不建议这么做!

内容的提问来源于stack exchange,提问作者user9644796

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:26:35