-2

私は 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) が与えられた場合、次のことを行う必要があります。

  1. question.surveyId=であるすべての質問行を検索しますsurveyId
  2. (1) で見つかった各質問行について、answer.questionId=であるすべての回答行を見つけます。question.id
  3. (2) で見つかった各回答について、vote.answerId=であるすべての投票行を見つけますanswer.id
  4. 一意の 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 クエリとして行う方法はありますか?

4

2 に答える 2

1

必要なクエリは次のとおりです。

SELECT v.answerId, COUNT(*) 
FROM survey AS s 
     INNER JOIN question AS q ON s.id = q.surveyId
     INNER JOIN answer AS a ON q.id = a.questionId
     INNER JOIN vote AS v ON a.id = v.answerId
WHERE  s.id = 3 -- This's your specific value of surveyId
GROUP BY v.answerId 
ORDER BY v.answerId

ただし、このクエリは最適化できます。テーブルの関係を考慮して、単一の結合をあきらめることができます。

SELECT v.answerId, COUNT(*) 
FROM survey AS s 
     INNER JOIN question AS q ON s.id = q.surveyId AND s.id = 3
     INNER JOIN vote AS v ON q.id = v.questionId
GROUP BY v.answerId 
ORDER BY v.answerId

また、そのようなテスト データのセットを作成できないことに注意してください。テーブルの answerId の値が、このテーブルvoteの外部キー制約に違反しているためanswerIdです。22は表にありませんanswer

于 2013-10-18T01:21:31.353 に答える
0
SELECT 
  a.answerId
  , vote = COUNT(v.vote) 
FROM survey s
  INNER JOIN question q
    ON s.surveyid = q.surveyId
  INNER JOIN answer a
    ON q.questionId = a.questionID
  INNER JOIN vote v
    ON a.answerId = v.answerId
WHERE s.surveyID = @yourValue
GROUP BY a.answerId

あなたが探していると思うものです。

于 2013-10-17T23:33:44.687 に答える