我不知道我在使用 sql 时是否正确地执行了以下方法,但它就在这里。
我想显示所有考试详细信息(考试详细信息(也称为会话)、考试中的问题、答案、罚分、图像、视频等)但我尝试这样做的方式是一个大查询,但它不能正常工作正在显示行。
以下是我想为一项考试(而且只有一项考试)显示的内容:
- 考试详情
- 考试中的所有问题
- 每个问题的所有答案并标记每个答案的价值
- 惩罚(查看是否启用)
- 错误答案的扣分
- 有问题的图片
- 问题中的视频
- 有问题的音频
- 模块详情
- 学生
下面显示了上述每个部分需要从数据库中获取的字段:
考试详情
SessionId, SessionName, SessionDuration, TotalMarks, SessionWeight
考试中的所有问题
QuestionId, QuestionNo, QuestionContent, NoofAnswers, QuestionMarks, OptionId, OptionType, ReplyId, ReplyType
每个问题的所有答案并标记每个答案的价值
AnswerId, Answer, AnswerMarks
- 惩罚(查看是否启用)
PenaltyEnabled
- 处罚答案
PenaltyAnswerId, PenaltyAnswer, PenaltyMarks
- 有问题的图片
ImageId, ImageFile
- 问题中的视频
VideoId VideoFile
- 有问题的音频
AudioId, AudioFile
- 模块详情
ModuleId, ModuleNo, ModuleName
- 学生
StudentId
我的问题是应该如何编写 SQL 代码才能显示所有这些数据?我只需要一个大查询还是很多小查询?我的尝试是问题的底部,但下面是数据库表,其中显示了处理一项考试及其所有详细信息的详细信息。
表格:
学生
StudentId (PK) StudentForename StudentSurname
1 James Parker
Student_Session
SessionId (FK) StudentId (FK)
1 1
会议
SessionId (PK) SessionName SessionDuration TotalMarks SessionWeight ModuleId (FK)
1 AAA 01:00:00 30 20 1
模块
ModuleId (PK) ModuleNo ModuleName
1 CHI2513 ICT
问题
SessionId FK) QuestionId (PK) QuestionNo QuestionContent NoofAnswers QuestionMarks OptionId (FK) ReplyId (FK)
1 4 1 Question 1 1 5 1 1
1 5 2 Question 2 1 3 2 1
1 6 3 Question 3 2 6 2 2
1 7 4 Question 4 3 7 5 2
1 8 5 Question 5 1 9 5 1
回答:
AnswerId (PK) Answer QuestionId (FK)
1 A 4
2 C 5
3 A 6
4 B 6
5 B 7
6 D 7
7 E 7
8 G 8
个人回答
IndividualId (PK) AnswerId (FK) AnswerMarks
1 1 3
2 2 5
3 3 3
4 4 3
5 5 2
6 6 2
7 7 3
8 8 9
惩罚
PenaltyId(PK) SessionId (FK) PenaltyEnalbed
1 1 1
罚分
PenaltyAnswerId (PK) PenaltyAnswer PenaltyMarks QuestionId (FK)
1 B 1 4
2 C 1 4
3 A 1 5
4 B 1 5
5 D 1 5
6 C 2 6
7 D 2 6
8 A 1 7
9 C 1 7
10 F 1 7
11 G 1 7
12 A 0 8
13 B 0 8
14 C 1 8
15 D 1 8
16 E 1 8
17 F 0 8
回复
ReplyId (PK) ReplyType
1 Single
2 Multiple
选项表
OptionId (PK) OptionType
1 A-C
2 A-D
3 A-E
4 A-F
5 A-G
图片
ImageId (PK) ImageFile
1 ImageFile/Tulips.png
2 ImageFile/Daisys.png
视频
VideoId (PK) VideoFile
1 VideoFile/Speech.png
声音的
AudioId (PK) AudioFile
1 AudioFile/Song.png
Image_Question
ImageQuestionId (PK) ImageId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 2
视频_问题
VideoQuestionId (PK) VideoId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 4
音频_问题
AudioQuestionId (PK) AudioId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 5
以下是我失败的尝试:
SELECT s.SessionId,
SessionName,
SessionDuration,
TotalMarks,
SessionWeight,
q.QuestionId,
q.QuestionNo,
QuestionContent,
QuestionMarks,
q.OptionId,
OptionType,
q.ReplyId,
ReplyType,
a.AnswerId,
Answer,
NoofAnswers,
AnswerMarks,
PenaltyEnabled,
PenaltyAnswerId,
PenaltyAnswer,
PenaltyMarks,
i.ImageId,
au.AudioId,
v.VideoId,
ImageFile,
AudioFile,
VideoFile,
s.ModuleId,
ModuleNo,
ModuleName,
ss.StudentId
FROM Student st
INNER JOIN Student_Session ss
ON st.StudentId = ss.StudentId
INNER JOIN Session s
ON ss.SessionId = s.SessionId
INNER JOIN Question q
ON s.SessionId = q.SessionId
INNER JOIN Answer a
ON q.QuestionId = a.AnswerId
INNER JOIN Individual_Answer ia
ON a.AnswerId = ia.AnswerId
LEFT JOIN Module m
ON s.ModuleId = m.ModuleId
LEFT JOIN Penalty p
ON q.SessionId = p.SessionId
LEFT JOIN Option_Table o
ON q.OptionId = o.OptionId
LEFT JOIN Reply r
ON q.ReplyId = r.ReplyId
LEFT JOIN Penalty_Marks pm
ON q.QuestionId = pm.QuestionId
LEFT JOIN Image_Question iq
ON q.QuestionId = iq.QuestionNo
INNER JOIN Image i
ON iq.ImageId = i.ImageId
LEFT JOIN Audio_Question aq
ON q.QuestionId = aq.QuestionNo
INNER JOIN Audio au
ON aq.AudioId = au.AudioId
LEFT JOIN Video_Question vq
ON q.QuestionId = vq.QuestionNo
INNER JOIN Video v
ON vq.VideoId = v.VideoId
WHERE s.SessionId = 1
ORDER BY q.QuestionId
更新:
提交问题后,下面的代码是否能够将 QuestionId 插入 Image_Question 表中:(这是我在 SO 上找到的,但已更新为我的表设计)
ImageQuestionToken
{
ImageToken (PK auto)
SessionId
}
Image{
ImageId
ImageFile
}
Image_Question
{
Image_QuestionId
ImageId FK references Image(ImageId)
QuestionId FK references Question(QuestionId)
}
Question
{
QuestionId (PK Auto)
QuestionNo
QuestionContent
....
}
TempImage
{
ImageToken FK references ImageQuestionToken(ImageToken)
ImageFile
}
像这样的逻辑:
- 用户请求问题表。服务器设置令牌并包含响应用户。
- 用户上传包含令牌的图片。图像存储在临时表中。
- 步骤 2 重复 n 次。
- 如果用户提交带有令牌值的问题,则会在问题表中放置一个条目并分配一个 id。TempImage 表中共享令牌的所有图像都将插入到具有现在已知 QuestionId 的图像表中。然后删除 ImageQuestionToken 条目,并级联删除 TempImage 中的临时图像。
- 否则用户不提交问题,则文件被删除并 ImageQuestionToken 条目被删除。