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_id | user_name |
|---|---|
| 100 | Alice |
| 14 | Bob |
| 213 | Charlie |
| 55 | Dave |
用聚合查询会得到:
| post_creator_id | user_name | 帖子ID列表 | 帖子标题列表 |
|---|---|---|---|
| 14 | Bob | 2 | Good morning |
| 55 | Dave | 4 | Nice... |
| 100 | Alice | 1 | Hello All |
| 213 | Charlie | 3 | Lovely Day |
用排序查询会得到按创作者ID排序的完整行数据:
| post_id | post_creator_id | post_title | user_name |
|---|---|---|---|
| 2 | 14 | Good morning | Bob |
| 4 | 55 | Nice... | Dave |
| 1 | 100 | Hello All | Alice |
| 3 | 213 | Lovely Day | Charlie |
小提醒
- 如果你的关联表不是
users,记得替换表名和JOIN的关联条件 - 要是你确实需要
GROUP BY后直接拿全部非聚合列,某些数据库可以关闭严格模式实现,但这是不规范写法,结果可能随机,非常不建议这么做!
内容的提问来源于stack exchange,提问作者user9644796
相关产品推荐
相关产品推荐

