0

クイズのタイトル、クイズの説明、クイズの質問と各質問の回答を取得する必要があります。私のテーブル構造は次のとおりです。

quizes
quize_id | title | user_id | ...

questions
questions_id | quize_id | question | ...

question_answers
answer_id | question_id | user_id | answer | ...

参加できます

SELECT * FROM quizes JOIN questions q ON q.quize_id=quizes.quize_id JOIN question_answers a ON a.question_id=q.question_id

しかし、これに伴う問題は、冗長なデータを含む多くの行が結果として得られることです。たとえば、各行にはフィールドtitle、user_id、...が含まれます。別の方法は、質問ごとに追加のクエリを作成して回答を取得することです。より良い方法はありますか?1つ以上のクエリを使用する必要がありますか?

4

2 に答える 2

1

各質問のユーザーの詳細など、必要なすべてのデータを返す別の方法も見つけました。

SELECT 
    question, 
    group_concat(qa.answer SEPARATOR ',') as answers,
    group_concat(qa.user_id SEPARATOR ',') as userIds,
    group_concat(up.nickname SEPARATOR ',') as nickname
FROM quize_questions qq
INNER JOIN question_answers qa ON qa.question_id=qq.question_id
INNER JOIN user_profile up ON up.user_id = qa.user_Id
GROUP BY qq.question_id

これが正しい方法かどうかはわかりません。スピードが気になります。

于 2012-08-23T09:25:28.827 に答える
1

テーブルには 3 種類のデータが保持されます。取得したクエリを使用すると、すべてのデータが大きなテーブルとして取得されます。これには多くの重複が含まれるとおっしゃいました。

複数のクエリを使用すると、複数の結果セットが得られ、事実上複数のテーブルが残るため、これが役立つ可能性はほとんどありません。

データを取得する列だけにクエリを切り詰めることができます。

SELECT qq.Question, qa.Answer
FROM quizes qz 
  join questions qq on qz.quize_id = qq.quize_id 
  join question_answers qa on qq.question_id = qa.question_id
WHERE qz.quize_id = @quize_id
ORDER BY 1, 2  --or other ordering

ただし、同じ質問に対して複数の回答がある場合、質問はすべての行で繰り返されます。それについてできることはあまりありません。それは、複数のテーブルのデータを 1 つのテーブルに結合すること (「非正規化」) の代償です。

出力テーブルを次のようにフォーマットする必要がある場合 (ただし、列を増やします):

    Quize_id | Question | Answer
    1          Q1         A1
                          A2
               Q2         A3
    2          Q3         A4

これはまったく別の問題です。表示する並べ替え順序でデータを並べ替えて、一時テーブルにデータを入力するために持っているクエリを使用する必要があります。このテーブルに主キー (整数) 列を追加し、一連の更新ステートメントを実行して繰り返される値を null に置き換え、主キー列の順序でテーブルを出力する必要があります。(他にもやり方はありますが、これが一番分かりやすいです)

これは役に立ちますか?

于 2012-08-23T00:30:32.560 に答える