如何在下面编写SQL以显示所有细节

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)

这样的逻辑:

  1. 用户请求问题表单.服务器设置令牌并包含以响应用户.
  2. 用户上传包含令牌的图片.图像存储在临时表中.
  3. 第2步重复n次.
  4. 如果用户使用令牌值提交问题,则会在问题表中放置一个条目并分配一个ID.TempImage表中共享令牌的所有图像都使用现在已知的QuestionId插入到图像表中.然后删除ImageQuestionToken条目,级联删除TempImage中的临时图像.
  5. 其他用户不提交问题,然后删除文件并删除ImageQuestionToken条目.

Jos*_*uel 1

这些表中的外键存在问题: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)