3 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
所以它應(yīng)該有 3 個(gè)學(xué)生和 4 個(gè)科目的 12 個(gè)元素(3 乘以 4)。
您在這里要求的是CROSS JOIN學(xué)生和科目之間的關(guān)系,它將為您提供這兩個(gè)表的笛卡爾積。這是重要的部分。通過(guò)交叉連接學(xué)生和科目,您可以獲得所有學(xué)生和所有科目的組合。
然后,您可以使用表格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;
請(qǐng)參閱http://sqlfiddle.com/#!9/57ffd8/1上的工作示例

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
我將通過(guò)生成學(xué)生和科目的笛卡爾積來(lái)解決這個(gè)問(wèn)題cross join:這為您提供了學(xué)生和科目的所有可能組合。然后,您可以帶上標(biāo)記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 上的演示:
編號(hào) | 學(xué)生 | 標(biāo)記 | 主題
---: | :-------- | ---: | :--------
1 | 謝爾蓋 | 3 | 英語(yǔ)
2 | 德米特里 | 5 | 英語(yǔ)
3 | 弗拉迪斯拉夫 | 4 | 科學(xué)
4 | 謝爾蓋 | 5 | 地理
5 | 弗拉迪斯拉夫 | 3 | 地理
6 | 德米特里 | 4 | 科學(xué)
7 | 弗拉迪斯拉夫 | 3 | 英語(yǔ)
8 | 謝爾蓋 | 4 | 歷史
空| 德米特里 | 空| 歷史
null | 弗拉迪斯拉夫 | 空| 歷史
null | 謝爾蓋 | 空| 科學(xué)
null | 德米特里 | 空| 地理

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
閱讀您的帖子后,我對(duì)您的問(wèn)題的看法是,沒(méi)有任何請(qǐng)求可以產(chǎn)生您想要的結(jié)果。
讓我們分析一下表格的語(yǔ)義:
Subjects 定義了所有的主題
學(xué)生定義所有學(xué)生
分?jǐn)?shù)記錄學(xué)生在科目中的所有測(cè)試結(jié)果
因此,在您的 MySQL 查詢(xún)中,您要求引擎首先選擇所有現(xiàn)有的學(xué)生
FROM students
然后,您要檢索這些學(xué)生的所有現(xiàn)有分?jǐn)?shù),或者如果學(xué)生根本不存在任何分?jǐn)?shù),則為 null
LEFT OUTER JOIN marks ON students.id = marks.student
請(qǐng)注意,您已經(jīng)在上面編寫(xiě)了marks.student 但定義了marks.student_id,這里假設(shè)錯(cuò)字。
下一步就是訣竅所在。此時(shí),您將得到如下所示的結(jié)果:
id | student | mark
=====================
1 | Sergey | 3
2 | Dmitriy | 5
注意:出于可讀性目的,我縮短了結(jié)果
您需要的下一步是加入主題表以添加他們的標(biāo)簽。但是像你在這里一樣加入主題表......
LEFT OUTER JOIN subjects ON marks.subject = subject.id
請(qǐng)注意,這里再次假設(shè)拼寫(xiě)錯(cuò)誤,標(biāo)記.主題而不是標(biāo)記.主題_id
... 只會(huì)產(chǎn)生 ID 位于之前通過(guò)加入 Marks 表產(chǎn)生的任何行中的主題的標(biāo)簽。
解決方案 :
我建議您定義一個(gè)表格,記錄任何給定學(xué)生所學(xué)的科目。像這樣的東西:
Attends
id | student_id | subject_id
============================
1 | 1 | 2
2 | 2 | 4
您的請(qǐng)求將如下所示:
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 所指出的,交叉連接可能更容易,因?yàn)樗恍枰魏涡卤怼?/p>
- 3 回答
- 0 關(guān)注
- 167 瀏覽
添加回答
舉報(bào)