php。从结果表构建多维数组

我有两个 mysql 表,其中包含学生和学校科目,如下所示:


科目


id  |  name

=================

1   |  History

2   |  English

3   |  Science

4   |  Geography

学生


id  |  name

=================

1   |  Sergey

2   |  Dmitriy

3   |  Vladislav

第三个表在 Student 和 Subjects 表之间建立了多对多的关系,并且还具有标记列:


分数


id  |  student_id  |  subject_id  |  mark

==========================================

1   |      1       |      2       |  3

2   |      2       |      2       |  5

3   |      3       |      3       |  4

4   |      1       |      4       |  5

5   |      3       |      4       |  3

6   |      2       |      3       |  4

7   |      3       |      2       |  3

8   |      1       |      1       |  4

目标是构建一个多维数组,最终如下所示。如果没有这样的学生和学科匹配,它必须在“mark”键中返回“null”值。所以它应该有 3 个学生和 4 个科目的 12 个元素(3 乘以 4)。


我尝试了这个 sql 查询,但它不返回具有“null”值的记录,而是只返回来自“Marks”表的记录:


SELECT marks.id AS id, 

   students.name AS student,

   marks.mark AS mark,

   subjects.name AS subject

FROM students 

    LEFT OUTER JOIN marks ON students.id = marks.student

    LEFT OUTER JOIN subjects ON marks.subject = subject.id

所需数组:


Array

(

    [

        "id" => 1,

        "student" => "Sergey",

        "subject" => "History",

        "mark" => 4,

    ],

    [

        "id" => 2,

        "student" => "Sergey",

        "subject" => "English",

        "mark" => 3,

    ],

    ...

    [

        "id" => 9,

        "student" => "Vladislav",

        "subject" => "History",

        "mark" => null,

    ],

    ...

    [

        "id" => 12,

        "student" => "Vladislav",

        "subject" => "Geography",

        "mark" => 3,

    ],

)

有谁知道如何做到这一点?谢谢你,希望你能帮助我。


慕工程0101907
浏览 204回答 3
3回答

jeck猫

所以它应该有 3 个学生和 4 个科目的 12 个元素(3 乘以 4)。您在这里要求的是CROSS JOIN学生和科目之间的关系,它将为您提供这两个表的笛卡尔积。这是重要的部分。通过交叉连接学生和科目,您可以获得所有学生和所有科目的组合。然后,您可以使用表格LEFT JOIN的那部分,如下所示:marksSELECT marks.id AS mark_id,    students.name AS student,   marks.mark AS mark,   subjects.name AS subjectFROM students CROSS JOIN subjects   LEFT JOIN marks      ON students.id = marks.student_id AND marks.subject_id = subjects.id;请参阅http://sqlfiddle.com/#!9/57ffd8/1上的工作示例

慕尼黑的夜晚无繁华

我将通过生成学生和科目的笛卡尔积来解决这个问题cross join:这为您提供了学生和科目的所有可能组合。然后,您可以带上标记left join:select     marks.id as id,     students.name as student,    marks.mark as mark,    subjects.name as subjectfrom students cross join subjectsleft join marks on marks.student_id = students.id and marks.subject_id = subjects.idDB Fiddle 上的演示:  编号 | 学生 | 标记 | 主题  ---: | :-------- | ---: | :--------   1 | 谢尔盖 | 3 | 英语     2 | 德米特里 | 5 | 英语     3 | 弗拉迪斯拉夫 | 4 | 科学     4 | 谢尔盖 | 5 | 地理   5 | 弗拉迪斯拉夫 | 3 | 地理   6 | 德米特里 | 4 | 科学     7 | 弗拉迪斯拉夫 | 3 | 英语     8 | 谢尔盖 | 4 | 历史  空| 德米特里 | 空| 历史  null | 弗拉迪斯拉夫 | 空| 历史  null | 谢尔盖 | 空| 科学  null | 德米特里 | 空| 地理

www说

阅读您的帖子后,我对您的问题的看法是,没有任何请求可以产生您想要的结果。让我们分析一下表格的语义:Subjects 定义了所有的主题学生定义所有学生分数记录学生在科目中的所有测试结果因此,在您的 MySQL 查询中,您要求引擎首先选择所有现有的学生FROM students然后,您要检索这些学生的所有现有分数,或者如果学生根本不存在任何分数,则为 nullLEFT OUTER JOIN marks ON students.id = marks.student请注意,您已经在上面编写了marks.student 但定义了marks.student_id,这里假设错字。下一步就是诀窍所在。此时,您将得到如下所示的结果:id | student   | mark =====================1  | Sergey    | 32  | Dmitriy   | 5注意:出于可读性目的,我缩短了结果您需要的下一步是加入主题表以添加他们的标签。但是像你在这里一样加入主题表......LEFT OUTER JOIN subjects ON marks.subject = subject.id请注意,这里再次假设拼写错误,标记.主题而不是标记.主题_id... 只会产生 ID 位于之前通过加入 Marks 表产生的任何行中的主题的标签。解决方案 :我建议您定义一个表格,记录任何给定学生所学的科目。像这样的东西:Attendsid | student_id | subject_id============================1  | 1          | 22  | 2          | 4您的请求将如下所示:SELECT Marks.id AS id,Students.name AS student,Marks.mark AS mark,Subjects.name AS subjectFROM Students JOIN Attends ON Students.id = Attends.student_idJOIN Subjects ON Subjects.id = Attends.subject_idLEFT JOIN marks ON Marks.subject = Subjects.id编辑:正如GMB和Mathias-S 所指出的,交叉连接可能更容易,因为它不需要任何新表。
打开App,查看更多内容
随时随地看视频慕课网APP