2017-08-06 1 views
0

私は、各質問が正しく答えられた回数と間違って何回回答されたかを把握したい小さなクイズアプリを持っています。質問、Playthrus、AnswerCountの3つのテーブルがあります。 Playthrusの表では、私は(1)incorrect_answerをキャプチャします。これはプライマリキーですint質問の間違った答えによってクイズが終了しました。 (2)correct_answers質問の主キーが正しく応答されています。Postgres 9.6.x:プライマリテーブルからセカンダリテーブルを自動更新する方法は?

AnswerCountsテーブルには、id,correct_count、およびincorrect_countの3つの列があります。 idは質問テーブルIDにマッピングされます。

私の質問は:どのように新しい行がPlaythrusテーブルに提出されるたびに、(1)incorrect_answercorrect_answers列で見つかったすべての主キーの行を作成または更新など、ことを私はセットアップ私のPostgresデータベースことができます。 (2)correct_countincorrect_countはそれに応じて増分されますか?

また、この問題に間違って近づいていますが、より良い方法がありますか?

私はPostgres 9.6.3を使用しており、Sequelizeしています。


編集:以下の応答ごとに、増分トリガを捨てて新しいテーブルAnswersを作成しました。

CREATE TABLE answers(
    id serial primary key, 
    question_id int REFERENCES questions (id), 
    playthru_id int REFERENCES playthrus (id), 
    was_correct boolean 
); 

この表を、特定のプレイスルーからのすべての回答で間違いなく修正します。質問を決定するための

Queryが正しく、ほとんどのほとんどと誤っに答え:

SELECT id 
    FROM questions 
    WHERE id in (
     SELECT question_id 
     FROM answers 
     GROUP BY question_id 
     ORDER BY COUNT(CASE WHEN [NOT] was_correct THEN 1 END) <-- 
    DESC LIMIT 1) 

答えて

1

正規化ルールでは、「正解」の配列を別のテーブル(回答あたり1行)に置き換える必要があると言われます。これは、質問の主キーである "playthru"の主キーとブール値の "正しい"カラムを参照できます。これにより、実際の回答や質問に費やした時間など、現在のデザインでは取り込めない追加データの余地が残されます。

既存の配列をarray_agg関数を使用してクエリを選択し、完全な質問に参加してIDだけでなくテキストの配列を取得することもできます。

重要なことに、質問IDごとにグループ化して「正しかった」とカウント(*)を出力することで、正確なカウントと間違ったカウントを計算することができます。簡単に処理するために1行に正しいと間違ったの両方を取得するには、次のようにcase文を使用することができます。

SELECT 
    question_id, 
    COUNT(CASE WHEN was_correct THEN 1 END) as correct_answers, 
    COUNT(CASE WHEN NOT was_correct THEN 1 END) as incorrect_answers 
FROM playthru_questions 
GROUP BY question_id 

ここのトリックは、COUNTがCASEが一致しないNULLを無視し、行をカウントその条件に一致する。

+0

私はあなたがこの理論的根拠をどこに置いているのが好きです。私が解決したら解決します。私が解決したいと思っているもう一つの問題は、「最も間違った」質問と「最も正しい」質問を取り出す方法です。おそらく質問表の新しい列ですか?私の最初の考えは、そのテーブルを純粋で不変のままにすることでした。 – Kwhitejr

+0

@Kwhitejrこれは簡単です: '桁数で注文する(was_correct THEN 1 END)DESC LIMIT 1'。実際に重要なパフォーマンス上の問題が発生するまで、生データから計算できるものはすべて保存する必要はありません。リレーショナルデータベース設計の美点です。 – IMSoP

+0

多くのありがとう。最後に1つを指定することができたら、提案された行(編集された質問の矢印の行を参照)によって行われたカウントをクエリ結果にどのように追加できますか? Answersテーブルの 'was_correct'エントリの' COUNT'は質問テーブルでは利用できませんので、完全に別のクエリなしでこの番号を取得する方法は不明です。私は 'WITH'と' JOIN'を使いこなしましたが、質問idと一緒に希望の数を得ることができませんでした。 – Kwhitejr

1

は、PostgreSQLのドキュメントでCREATE TRIGGERをチェックしてください。

関連する問題