2013-10-17 77 views
-2

我對SQL相當陌生,所以我不確定我試圖做什麼甚至被稱爲聯接。SQL查詢加入3個表

我有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查詢?

+1

你試過連接表嗎? –

+0

如果您閱讀我的問題,我提到我不知道我在做什麼 - 我不知道如何進行連接,我甚至不知道是否需要連接。 –

+0

如果你不知道你在做什麼,那麼也許一個好的開始將是瞭解SQL JOINS http://www.w3schools.com/sql/sql_join.asp – Bruce

回答

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 

並注意你不能創建一組這樣的測試數據。因爲表vote中的answerId值違反了此表中的外鍵約束answerId22不在表answer中。

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 

是我想你在找什麼。