如何使用 sql 将值选择为数组?

Posted

技术标签:

【中文标题】如何使用 sql 将值选择为数组?【英文标题】:How is it possible to select the value as array using sql? 【发布时间】:2019-10-27 21:47:56 【问题描述】:

在从表中选择 mysql 中的值时, 例如组 g,其中包含列 g.id、g.name

还有一个名为 group_members 的表

我需要获取包含所有成员的所有组

所以sql会返回结果为

1. group_id : 1, group_name : john, members_ids : [12,14]
2. group_id : 2  group_name : jill, members_ids : [12,13,14,15]



SELECT g.id as group_id, 
g.name as group_name,
ug.members_ids
FROM groups g
LEFT JOIN group_members gm on gm.user_id = [Userid]

组表


id | name
-----------
1 | group 1
2 | group 2

group_members 表


id | group_id | user_id
1  | 1        | 12
2  | 1        | 14
3  | 2        | 12
4  | 2        | 13
4  | 2        | 13

【问题讨论】:

示例表数据预期的结果会很棒! mysql 5.7 group_concat 可以工作,但 JSON 函数不行,我猜 【参考方案1】:

如果我理解正确你可以尝试使用GROUP_CONCAT函数

SELECT 
    g.id as group_id, 
    g.name as group_name,
    GROUP_CONCAT(gm.user_id SEPARATOR ',')  members_ids
FROM groups g
LEFT JOIN group_members gm on g.id = gm.group_id
GROUP BY 
    g.id, 
    g.name 

或者显示为JSON数组你可以尝试使用JSON_ARRAYAGG函数

SELECT 
    g.id as group_id, 
    g.name as group_name,
    JSON_ARRAYAGG(gm.user_id)  members_ids
FROM groups g
LEFT JOIN group_members gm on g.id = gm.group_id
GROUP BY 
    g.id, 
    g.name 

【讨论】:

Topicstarter 请记住,JSON_ARRAYAGG 我相信仅适用于 5.7.20/22 左右的 MySQL 版本 组 concat 只返回一行 SELECT g.id as group_id, g.name as group_name, GROUP_CONCAT(gm.user_id SEPARATOR ',') members_ids FROM groups g LEFT JOIN group_members gm on g.id = gm.group_id GROUP BY g.id, g.name 下面的代码返回所有行,但是如果我选择组 concat 它只返回一行` SELECT g.id as group_id, g.name as group_name FROM groups g LEFT JOIN group_members gm on g.id = gm.group_id GROUP BY g.id, g.name `

以上是关于如何使用 sql 将值选择为数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值设置为jtable?

如何将值推送到 Cypher 中的属性数组?

如何在快速排序中选择枢轴值?

如何将值的数组参数输入到 Firebird 存储过程?

如何将值数组(或列)定义为过程参数?

如何将值设置为二维 Excel 范围?