2013-10-17 78 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 

是我想你在找什么。