3 回答

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

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 | 德米特里 | 空| 地理

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 所指出的,交叉連接可能更容易,因為它不需要任何新表。
- 3 回答
- 0 關注
- 156 瀏覽
添加回答
舉報