亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

php。從結果表構建多維數組

php。從結果表構建多維數組

PHP
慕工程0101907 2022-06-11 16:47:38
我有兩個 mysql 表,其中包含學生和學??颇浚缦滤荆嚎颇縤d  |  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 關注
  • 156 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號