use*_*760 8 mysql sql database mysqli
我不知道在使用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
Run Code Online (Sandbox Code Playgroud)
Student_Session
SessionId (FK) StudentId (FK)
1 1
Run Code Online (Sandbox Code Playgroud)
会议
SessionId (PK) SessionName SessionDuration TotalMarks SessionWeight ModuleId (FK)
1 AAA 01:00:00 30 20 1
Run Code Online (Sandbox Code Playgroud)
模
ModuleId (PK) ModuleNo ModuleName
1 CHI2513 ICT
Run Code Online (Sandbox Code Playgroud)
题
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
Run Code Online (Sandbox Code Playgroud)
回答:
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
Run Code Online (Sandbox Code Playgroud)
个人答案
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
Run Code Online (Sandbox Code Playgroud)
罚款
PenaltyId(PK) SessionId (FK) PenaltyEnalbed
1 1 1
Run Code Online (Sandbox Code Playgroud)
PenaltyMarks
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
Run Code Online (Sandbox Code Playgroud)
答复
ReplyId (PK) ReplyType
1 Single
2 Multiple
Run Code Online (Sandbox Code Playgroud)
Option_Table
OptionId (PK) OptionType
1 A-C
2 A-D
3 A-E
4 A-F
5 A-G
Run Code Online (Sandbox Code Playgroud)
图片
ImageId (PK) ImageFile
1 ImageFile/Tulips.png
2 ImageFile/Daisys.png
Run Code Online (Sandbox Code Playgroud)
视频
VideoId (PK) VideoFile
1 VideoFile/Speech.png
Run Code Online (Sandbox Code Playgroud)
音频
AudioId (PK) AudioFile
1 AudioFile/Song.png
Run Code Online (Sandbox Code Playgroud)
Image_Question
ImageQuestionId (PK) ImageId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 2
Run Code Online (Sandbox Code Playgroud)
Video_Question
VideoQuestionId (PK) VideoId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 4
Run Code Online (Sandbox Code Playgroud)
Audio_Question
AudioQuestionId (PK) AudioId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 5
Run Code Online (Sandbox Code Playgroud)
以下是我失败的尝试:
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
Run Code Online (Sandbox Code Playgroud)
更新:
以下代码是否能够在提交问题后将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
}
Run Code Online (Sandbox Code Playgroud)
这样的逻辑:
这些表中的外键存在问题:Image_Question、Audio_Question 和 Video_Question。
您正在使用 QuestionNo 列,该列未由 Question 表索引。我建议将列替换为 QuestionId 并使用它们的值。
Image_Question
ImageQuestionId (PK) ImageId (FK) SessionId (FK) QuestionNo(FK)
1 1 1 2
Video_Question
VideoQuestionId (PK) VideoId (FK) SessionId (FK) QuestionNo(FK)
1 1 1 4
Audio_Question
AudioQuestionId (PK) AudioId (FK) SessionId (FK) QuestionNo(FK)
1 1 1 5
Run Code Online (Sandbox Code Playgroud)
你的声明应该如下所示:
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.QuestionNo= iq.QuestionNo
LEFT JOIN Image i
ON iq.ImageId = i.ImageId
LEFT JOIN Audio_Question aq
ON q.QuestionNo= aq.QuestionNo
LEFT JOIN Audio au
ON aq.AudioId = au.AudioId
LEFT JOIN Video_Question vq
ON q.QuestionNo= vq.QuestionNo
LEFT JOIN Video v
ON vq.VideoId = v.VideoId
WHERE s.SessionId = 1
ORDER BY q.QuestionId
Run Code Online (Sandbox Code Playgroud)
更新:毕竟您可以使用 QuestionNo 列,您可以只添加索引,这样您就不必彻底修改代码。呵呵呵呵
我建议你添加这个:
ALTER TABLE `your_schema`.`Question`
ADD INDEX `your_idx` (`QuestionNo` ASC);
Run Code Online (Sandbox Code Playgroud)
而不是这些:
LEFT JOIN Image_Question iq
ON q.QuestionId = iq.QuestionId -- from iq.QuestionNo
LEFT JOIN Image i
ON iq.ImageId = i.ImageId
LEFT JOIN Audio_Question aq
ON q.QuestionId = aq.QuestionId -- from aq.QuestionNo
LEFT JOIN Audio au
ON aq.AudioId = au.AudioId
LEFT JOIN Video_Question vq
ON q.QuestionId = vq.QuestionId -- from vq.QuestionNo
LEFT JOIN Video v
ON vq.VideoId = v.VideoId
Run Code Online (Sandbox Code Playgroud)
你使用这些:
LEFT JOIN Image_Question iq
ON q.QuestionNo= iq.QuestionNo
LEFT JOIN Image i
ON iq.ImageId = i.ImageId
LEFT JOIN Audio_Question aq
ON q.QuestionNo= aq.QuestionNo
LEFT JOIN Audio au
ON aq.AudioId = au.AudioId
LEFT JOIN Video_Question vq
ON q.QuestionNo= vq.QuestionNo
LEFT JOIN Video v
ON vq.VideoId = v.VideoId
Run Code Online (Sandbox Code Playgroud)