mysql pgsql 按照指定字段分组实现多行合并成一行
数据库服务器环境
| 数据库 | 版本 |
|---|
| mysql | 5.7.34 |
| PostgreSQL | 10.10 |
原表结构和数据
students
| id | name | gender | age |
|---|
| 1 | 张三 | 男 | 33 |
| 2 | 李四 | 男 | 25 |
| 3 | 小谢 | 女 | 25 |
| 4 | 小周 | 女 | 26 |
scores
| id | score | student_id | course |
|---|
| 1 | 67 | 1 | 英语 |
| 2 | 78 | 1 | 数学 |
| 3 | 88 | 2 | 英语 |
| 4 | 97 | 2 | 数学 |
| 5 | 76 | 3 | 英语 |
pgsql
SQL
select students.*, array_to_json( array_agg (row_to_json(scores))) AS JsonArray
from students
left join scores on students.id = scores.student_id
group by students.id
结果
| id | name | gender | age | jsonarray |
|---|
| 4 | 小周 | 女 | 26 | [null] |
| 2 | 李四 | 男 | 25 | [{“id”:3,“score”:88,“student_id”:2,“course”:“英语”},{“id”:4,“score”:97,“student_id”:2,“course”:“数学”}] |
| 3 | 小谢 | 女 | 25 | [{“id”:5,“score”:76,“student_id”:3,“course”:“英语”}] |
| 1 | 张三 | 男 | 33 | [{“id”:1,“score”:67,“student_id”:1,“course”:“英语”},{“id”:2,“score”:78,“student_id”:1,“course”:“数学”}] |
mysql
SQL
SELECT students.*,
JSON_ARRAYAGG(JSON_OBJECT('id', scores.id,
'score', scores.score,
'course', scores.course,
'student_id', scores.student_id)) AS JsonArray
FROM students
left join scores on students.id = scores.student_id
GROUP BY students.id;
结果
| id | name | gender | age | JsonArray |
|---|
| 1 | 张三 | 男 | 33 | [{“id”: 1, “score”: 67, “course”: “英语”, “student_id”: 1}, {“id”: 2, “score”: 78, “course”: “数学”, “student_id”: 1}] |
| 2 | 李四 | 男 | 25 | [{“id”: 3, “score”: 88, “course”: “英语”, “student_id”: 2}, {“id”: 4, “score”: 97, “course”: “数学”, “student_id”: 2}] |
| 3 | 小谢 | 女 | 25 | [{“id”: 5, “score”: 76, “course”: “英语”, “student_id”: 3}] |
| 4 | 小周 | 女 | 26 | [{“id”: null, “score”: null, “course”: null, “student_id”: null}] |
相关文章导读
mysql 在select查询语句中使用临时变量累计求和 ;
相同列值的记录中再根据条件取其中最大或最新一条;
mysql经纬度求距离并排序
mysql pgsql 实现多行记录合并成一行 分组合并 用指定字符做分割