为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕工程0101907 2022-06-11 16:47:38
我有两个 mysql 表,其中包含学生和学校科目,如下所示:科目id  |  name=================1   |  History2   |  English3   |  Science4   |  Geography学生id  |  name=================1   |  Sergey2   |  Dmitriy3   |  Vladislav第三个表在 Student 和 Subjects 表之间建立了多对多的关系,并且还具有标记列:分数id  |  student_id  |  subject_id  |  mark==========================================1   |      1       |      2       |  32   |      2       |      2       |  53   |      3       |      3       |  44   |      1       |      4       |  55   |      3       |      4       |  36   |      2       |      3       |  47   |      3       |      2       |  38   |      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 subjectFROM 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,    ],)有谁知道如何做到这一点?谢谢你,希望你能帮助我。
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

所以它应该有 3 个学生和 4 个科目的 12 个元素(3 乘以 4)。


您在这里要求的是CROSS JOIN学生和科目之间的关系,它将为您提供这两个表的笛卡尔积。这是重要的部分。通过交叉连接学生和科目,您可以获得所有学生和所有科目的组合。


然后,您可以使用表格LEFT JOIN的那部分,如下所示:marks


SELECT marks.id AS mark_id, 

   students.name AS student,

   marks.mark AS mark,

   subjects.name AS subject

FROM 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上的工作示例


查看完整回答
反对 回复 2022-06-11
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我将通过生成学生和科目的笛卡尔积来解决这个问题cross join:这为您提供了学生和科目的所有可能组合。然后,您可以带上标记left join:


select 

    marks.id as id, 

    students.name as student,

    marks.mark as mark,

    subjects.name as subject

from students 

cross join subjects

left join marks on marks.student_id = students.id and marks.subject_id = subjects.id

DB Fiddle 上的演示:


  编号 | 学生 | 标记 | 主题  

---: | :-------- | ---: | :--------

   1 | 谢尔盖 | 3 | 英语  

   2 | 德米特里 | 5 | 英语  

   3 | 弗拉迪斯拉夫 | 4 | 科学  

   4 | 谢尔盖 | 5 | 地理

   5 | 弗拉迪斯拉夫 | 3 | 地理

   6 | 德米特里 | 4 | 科学  

   7 | 弗拉迪斯拉夫 | 3 | 英语  

   8 | 谢尔盖 | 4 | 历史  

空| 德米特里 | 空| 历史  

null | 弗拉迪斯拉夫 | 空| 历史  

null | 谢尔盖 | 空| 科学  

null | 德米特里 | 空| 地理


查看完整回答
反对 回复 2022-06-11
?
www说

TA贡献1775条经验 获得超8个赞

阅读您的帖子后,我对您的问题的看法是,没有任何请求可以产生您想要的结果。

让我们分析一下表格的语义:

  • Subjects 定义了所有的主题

  • 学生定义所有学生

  • 分数记录学生在科目中的所有测试结果

因此,在您的 MySQL 查询中,您要求引擎首先选择所有现有的学生

FROM students

然后,您要检索这些学生的所有现有分数,或者如果学生根本不存在任何分数,则为 null

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

请注意,您已经在上面编写了marks.student 但定义了marks.student_id,这里假设错字。

下一步就是诀窍所在。此时,您将得到如下所示的结果:

id | student   | mark 

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

1  | Sergey    | 3

2  | Dmitriy   | 5

注意:出于可读性目的,我缩短了结果


您需要的下一步是加入主题表以添加他们的标签。但是像你在这里一样加入主题表......


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

请注意,这里再次假设拼写错误,标记.主题而不是标记.主题_id


... 只会产生 ID 位于之前通过加入 Marks 表产生的任何行中的主题的标签。


解决方案 :


我建议您定义一个表格,记录任何给定学生所学的科目。像这样的东西:


Attends

id | student_id | subject_id

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

1  | 1          | 2

2  | 2          | 4

您的请求将如下所示:


SELECT Marks.id AS id,

Students.name AS student,

Marks.mark AS mark,

Subjects.name AS subject

FROM Students 

JOIN Attends ON Students.id = Attends.student_id

JOIN Subjects ON Subjects.id = Attends.subject_id

LEFT JOIN marks ON Marks.subject = Subjects.id

编辑:正如GMB和Mathias-S 所指出的,交叉连接可能更容易,因为它不需要任何新表。


查看完整回答
反对 回复 2022-06-11
  • 3 回答
  • 0 关注
  • 203 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号