0

クエリの結果に問題があります。「QuestionContent」フィールドで正しい行が表示されていません。

たとえば、データベーステーブルに次のように記載されている場合(すべてのフィールドが含まれているわけではありません):

QuestionContent     Option Type    QuestionMarks     Answer   ....// other fields

What is 2+2         A-D            1                  D
What is 3+3         A-D            1                  B
What is 4+4         A-E            2                  C

次に、クエリを作成すると、結果が次のように表示されるのはなぜですか。

QuestionContent     Option Type    QuestionMarks     Answer   ....// other fields

What is 2+2         A-D            1                  D
What is 3+3         A-D            1                  D
What is 4+4         A-D            1                  D

以下は私が使用しているクエリです。これを修正して正しい結果を表示するにはどうすればよいですか?

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
FROM Answer a                
INNER JOIN Question q ON a.QuestionId = q.QuestionId
      JOIN Reply r ON q.ReplyId = r.ReplyId
      JOIN Question qu ON r.ReplyId = qu.ReplyId
      JOIN Option_Table o ON qu.OptionId = o.OptionId
GROUP BY q.QuestionContent

更新: 以下は、4 つのテーブルのスキーマです。

質問表:

SessionId (PK)  Varchar(3)
QuestionId(PK)  INT
QuestionContent Varchar(250)
NoofAnswers     INT
QuestionMarks   INT
ReplyId(FK)     Varchar(2)
OptionId(FK)    Varchar(2)

回答表

  SessionId (PK)  Varchar(3)
    QuestionId(PK)  INT
    Answer          Varchar(10)

Option_Table テーブル

  OptionId(PK)    Varchar(2)
  OptionType        Varchar(10)

返信テーブル

  ReplyId(PK)    Varchar(2)
  ReplyType        Varchar(10)

クエリでは、これらのフィールドを表示したい:

QuestionContent 
OptionType
NoofAnswers
Answer
ReplyType 
QuestionMarks 

それが十分な情報であることを願っています。そうでない場合は、私にコメントしてください:)

4

3 に答える 3

1

Question テーブルの主キーが SessionID + QuestionID であり、Answer テーブルの主キーも SessionID + QuestionID であるとすると、これら 2 つのテーブルの結合を両方の列で指定する必要があります。

FROM Answer   AS a
JOIN Question AS q ON q.SessionID = a.SessionID AND q.QuestionID = a.QuestionID

両方がないと、質問 ID が複数のセッションに表示されるときにデカルト積効果が発生します。

また、SessionID を選択していないため、2 つの異なるセッションに同じ質問と回答の情報がある重複した結果に対処する必要があります。SELECT DISTINCT はおそらく GROUP BY よりも優れていると思います。集計 (COUNT(*) や SUM(expression) など) がある場合に GROUP BY を予約し、一般的な「重複排除」には使用しないでください。


オリジナルコメンタリー

あなたの問題には2つの部分があると思います.1つはおそらく重要ではなく、もう1つはおそらく重要です.

あなたのクエリは、多かれ少なかれ次のとおりです。

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
FROM Answer a                
INNER JOIN Question q ON a.QuestionId = q.QuestionId
      JOIN Reply r ON q.ReplyId = r.ReplyId
      JOIN Question qu ON r.ReplyId = qu.ReplyId
      JOIN Option_Table o ON qu.OptionId = o.OptionId
GROUP BY q.QuestionContent

何らかの理由で Question を 2 回リストしましたが、2 つ目のエイリアスが必要であるという証拠はありません。それだけに基づいて、クエリを次のように単純化できます。

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
  FROM Answer       AS a                
  JOIN Question     AS q ON a.QuestionId = q.QuestionId
  JOIN Reply        AS r ON q.ReplyId = r.ReplyId
  JOIN Option_Table AS o ON q.OptionId = o.OptionId
 GROUP BY q.QuestionContent

これはおそらく重要ではない変更です。あなたは 1 対 1 で参加しているようです。オプティマイザーは、質問テーブルへの余分な 2 番目の参照を無視できる場合がありますが、使用されていないものについては言及しない方がよいでしょう。

おそらく重大な問題は、GROUP BY 句です。SQL のほとんどの方言では、GROUP BY 句で非集計の選択値をすべてリストする必要があります。非集計が表示されていないこのクエリでは、6 つの結果列すべてを一覧表示することになります。これを行わないと、MySQL はランダムに物事を処理します。私の疑いでは、完全なクエリに集計があるかどうかを明らかにし、GROUP BY が何をすべきかを説明する必要があります。単純に省略しても必要な答えが得られるのか、それとも何か他のことをする必要があるのか​​ どうかはわかりません。確実性に欠ける理由の 1 つは、質問にスキーマがないことです。テーブルのスキーマと、それらの間の主キーと外部キーの関係については、それほど多くを語ることはできません。

だから、私は(試して)使用することをお勧めします:

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
  FROM Answer       AS a                
  JOIN Question     AS q ON a.QuestionId = q.QuestionId
  JOIN Reply        AS r ON q.ReplyId = r.ReplyId
  JOIN Option_Table AS o ON q.OptionId = o.OptionId

それが「間違った行数」を与える場合は、スキーマと行間の関係を説明する必要があります。

于 2012-05-25T13:21:13.750 に答える
1

質問:複数選択の場合、回答は常に 1:1 の比率になります。質問表に回答列を入れてはいけない理由はありません。先ほど述べたように、「オプション タイプ」を外部キーとして使用し、潜在的な質問タイプのさまざまなセットにリンクできます。

編集:質問ごとに複数の回答ができるように再設計しました。

したがって、次のようなデザイン:

QuestionContent     QuestionID(PK)    QuestionMarks     AnswerID(PK)   ....// other fields

What is 2+2         1                    1                  1
What is 3+3         1                    1                  2
What is 4+4         2                    2                  3

および「オプション テーブル」

QuestionID(FK)     Option Type

1         A-D           
2         A-E            
3         A-C    

今すぐ答えの表

AnswerID(Fk) Answer

1         A           
1         B
2         A            
3         C
3         A

これにより、任意の数の回答タイプが残り、質問ごとに複数の回答が許可されます。

于 2012-05-25T12:14:02.377 に答える
0

別の表から回答を選択しています。(a.amswers) q.Answer を行う必要があります。

于 2012-05-25T11:52:14.757 に答える