私は SQL にかなり慣れていないので、私がやろうとしていることが結合と呼ばれるかどうかさえわかりません。
私はこのスキーマで4つのテーブルを持っています:
CREATE TABLE survey (
id serial PRIMARY KEY,
title text,
password text
);
CREATE TABLE question (
id serial PRIMARY KEY,
surveyId integer REFERENCES survey(id),
value text
);
CREATE TABLE answer (
id serial PRIMARY KEY,
questionId integer REFERENCES question(id) ,
value text
);
CREATE TABLE vote (
id serial,
questionId integer REFERENCES question(id),
answerId integer REFERENCES answer(id)
);
特定のsurvey.id
(surveyId) が与えられた場合、次のことを行う必要があります。
question.surveyId
=であるすべての質問行を検索しますsurveyId
- (1) で見つかった各質問行について、
answer.questionId
=であるすべての回答行を見つけます。question.id
- (2) で見つかった各回答について、
vote.answerId
=であるすべての投票行を見つけますanswer.id
。 - 一意の answerId ごとに投票行の数を返します。
したがって、次のテストデータがある場合:
question
=============
id | surveyId
1 | 3
2 | 3
3 | 3
4 | 5
5 | 6
answer
===============
id | questionId
1 | 1
2 | 1
3 | 2
4 | 3
vote
==========================
id | questionId | answerId
1 | 1 | 1
2 | 1 | 2
3 | 1 | 1
4 | 2 | 3
5 | 4 | 22
イニシャルsurveyId
が 3 の場合、このクエリの結果は次のようになります。
answerId | count
================
1 | 2
2 | 1
3 | 1
これを単一の SQL クエリとして行う方法はありますか?