MySQL中的JSON,返回1个(共3个)部门,列出所有员工

MySQL中的JSON,返回1个(共3个)部门,列出所有员工,mysql,sql,arrays,json,group-by,Mysql,Sql,Arrays,Json,Group By,在department表中,我有两个字段: documentid, which is INT jsondocument which is JSON 我执行了以下查询: INSERT INTO department VALUES (1,'{"department":{ "deptid":"d1", "deptname":"Marketing", "deptroom":"Room 7", "deptphone":["465-8541","465-8542","465-8543"], "employ

在department表中,我有两个字段:

documentid, which is INT
jsondocument which is JSON
我执行了以下查询:

INSERT INTO department VALUES
(1,'{"department":{
"deptid":"d1",
"deptname":"Marketing",
"deptroom":"Room 7",
"deptphone":["465-8541","465-8542","465-8543"],
"employee":[{
"empid":"e1",
"empname":"Mary Jones",
"empphone":"465-8544",
"empemail":["mjones@gmail.com","mjones@company.com"]},
{
"empid":"e2",
"empname":"Tom Robinson",
"empphone":"465-8545",
"empemail":["trobinson@gmail.com","trobinson@company.com"]},
{
"empid":"e3",
"empname":"Olivia Johnson",
"empphone":"465-8546",
"empemail":["ojohnson@gmail.com","ojohnson@company.com"]}
]}} ' );
使用相同的查询,我又添加了两个部门,每个部门有3名员工。我只想返回一个部门,列出所有员工,如下所示:

部门名称|员工
“营销”|“玛丽·琼斯、汤姆·罗宾逊、奥利维亚·约翰逊”(引号的位置无关紧要)

但我能找到的最接近的是这个查询,它列出了所有部门,每个部门只列出了第一名员工:

select
    jsondocument->'$.department.deptname' as deptname, 
    jsondocument->'$.department.employee[0].empname' as employees
from department;

这是家庭作业——一门初级课程,我努力学习,甚至达到了这一点。任何帮助都将不胜感激。

如果您运行的是MySQL 8.0,您可以使用
json\u table()
取消对
员工
数组的测试,然后使用聚合将所有员工姓名放在一行上

select 
    d.jsondocument ->> '$.department.deptname' deptname, 
    group_concat(j.empname) employees
from department d
cross join json_table(
    d.jsondocument -> '$.department.employee',
    '$[*]'
    columns(
        empid int path '$.empid',
        empname varchar(100) path '$.empname',
        empphone varchar(20) path '$.empphone',
        empemail json path '$.empemail'
    )
) j
group by d.jsondocument ->> '$.department.deptid', deptname
实际上,如果您只需要
empname
s,您可以将查询缩短一点:

select 
    d.jsondocument ->> '$.department.deptname' deptname, 
    group_concat(j.empname) employees
from department d
cross join json_table(
    d.jsondocument -> '$.department.employee',
    '$[*]'
    columns(empname varchar(100) path '$.empname')
) j
group by d.jsondocument ->> '$.department.deptid', deptname

deptname | employees :-------- | :------------------------------------- Marketing | Mary Jones,Tom Robinson,Olivia Johnson 部门名称|员工 :-------- | :------------------------------------- 营销|玛丽·琼斯、汤姆·罗宾逊、奥利维亚·约翰逊
这很简单,选择所有的名称进行营销

部门名称|员工 :---------- | :----------------------------------------------- “营销”|[“玛丽·琼斯”、“汤姆·罗宾逊”、“奥利维亚·约翰逊”]
dbfiddle

注意,在这个解决方案中,“employees”是一个JSON数组,而不是字符串。
select
    jsondocument->'$.department.deptname' as deptname, 
    jsondocument->'$.department.employee[*].empname' as employees
from department
HAVING deptname = 'Marketing';
deptname | employees :---------- | :----------------------------------------------- "Marketing" | ["Mary Jones", "Tom Robinson", "Olivia Johnson"]