SQLを使用するときに以下の方法を正しく実行しているかどうかはわかりませんが、ここではそうです。
すべての試験の詳細 (試験の詳細 (セッションとも呼ばれます)、試験の問題、解答、罰則、画像、ビデオなど) を表示したい行が表示されています。
以下は、1 つの試験 (および 1 つの試験のみ) で表示したいものです。
- 試験の詳細
- 試験のすべての問題
- 各質問に対するすべての回答と、各回答の価値をマークします
- ペナルティ (有効かどうかを確認)
- 不正解の場合は減点
- 問題の画像
- 質問の動画
- 質問の音声
- モジュールの詳細
- 学生
以下は、上記の各セクションがデータベースから必要とするフィールドを示しています。
試験の詳細
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 コードをどのように記述する必要があるかということです。1 つの大きなクエリだけが必要なのか、それとも多数の小さなクエリが必要なのか? 私の試みは質問の一番下にありますが、以下は、1 つの試験とそのすべての詳細を処理する詳細を示すデータベース テーブルです。
表:
学生
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
Option_Table
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
画像_質問
ImageQuestionId (PK) ImageId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 2
ビデオ_質問
VideoQuestionId (PK) VideoId (FK) SessionId (FK) QuestionNo (FK)
1 1 1 4
Audio_Questions
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
アップデート:
以下のコードは、質問が送信された後に Image_Question テーブルに QuestionId を挿入できますか: (これは 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 エントリが削除され、cascade によって TempImage 内の一時イメージが削除されます。
- それ以外の場合、ユーザーが質問を送信しないと、ファイルが削除され、ImageQuestionToken エントリが削除されます。