0

我正在制作一个教师界面,我有四个表教授、学生、所有作业和学生作业(所有学生的作业)

我想把所有学生和他们的所有作业都发给教授,但有些有多个作业,有些没有。我从第一个表中查询所有学生信息,现在我希望每一行(学生)都有一个属性 assignments,它是第二个表中所有作业的数组。

学生

Name Class Grade
s1   1     A
s2   2     B

作业

Name Student Status 
a1   s1      done
a2   s1      done

我想得到:

[
{Name:s1, Class: 1, Grade: A, Assignments:[{Name:a1, Status: done}, {Name:a2, Status: done}]},
{Name:s2, Class: 2, Grade: B, Assignments:[]}
] 

我正在使用 nodejs(mysql 模块)来查询数据库。


更新(来自评论)

版本 10.4.11-MariaDB – pro_programmer

4

2 回答 2

0

您可以使用 JSON 聚合:

select s.*, 
    (
        select json_arrayagg(json_object('Name', a.name, 'Status', a.status)) 
        from assignments a 
        where a.student = s.name
    ) assignments
from students s

如果 MariaDB 10.4json_arrayagg()不可用(但可用json_object()),则一种解决方法使用group_concat()

select s.*, 
    (
        select concat('[', group_concat(json_object('Name', a.name, 'Status', a.status), ']') 
        from assignments a 
        where a.student = s.name
    ) assignments
from students s
于 2020-10-23T10:46:30.603 回答
0
-- MySQL 8+ needed
WITH cte AS ( SELECT Student Name, JSON_ARRAYAGG(JSON_OBJECT('Name', Name, 
                                                             'Status', Status)) Assignments
              FROM Assignments
              GROUP BY Student )
SELECT JSON_OBJECT( 'Name', Students.Name,
                    'Class', Students.Class,
                    'Grade', Students.Grade,
                    'Assignments', COALESCE(cte.Assignments, JSON_ARRAY()) ) full_data
FROM Students
LEFT JOIN cte USING (Name);

或者

-- MySQL 5.7.22 needed
SELECT JSON_OBJECT( 'Name', Students.Name,
                    'Class', Students.Class,
                    'Grade', Students.Grade,
                    'Assignments', COALESCE(cte.Assignments, JSON_ARRAY()) ) full_data
FROM Students
LEFT JOIN ( SELECT Student Name, JSON_ARRAYAGG(JSON_OBJECT('Name', Name, 
                                                           'Status', Status)) Assignments
            FROM Assignments
            GROUP BY Student ) cte USING (Name);

小提琴

于 2020-10-23T10:55:25.053 回答