2014-06-20 31 views
2

我有四个表链接加入回到目标表

Survey   Question  Responses  Participants 
============= ============== ============== ============= 
id_S   id_Q   id_R   id_P 
       id_S   id_Q   id_S 
           id_P 
           id_S 
           Answer 

我试图找出如何检索谁给了“d”作为回答问题3#参与者所有响应。

这是我的第一个怪人,但毫不奇怪它不起作用。

SELECT * 
FROM responses r 
LEFT JOIN participants p 
ON r.id_P = p.id_P 
LEFT JOIN responses r2 
ON p.id_R = r.id_P 
WHERE r.id_S = 1 AND r2.Answer = "D" AND r2.id_Q = 1 

通过不起作用它会返回太多的记录。 SQL Select * FROM responses WHERE id_S =1将返回1,891条记录,但上述热点混乱将返回15,128条记录。

很明显,我甚至没有正确的概念来解决这个问题,它不是一个简单的语法调整。

+1

把它分成两个查询第(1)检索是谁给了“d”作为答案的问题3参与者,和(2)检索参与者可以在任何响应(1)。从那里出发 – Oerd

+0

你为什么不参加这个问题? –

+1

您在询问“参与者的所有答复”,而不是“参与者在调查1中的所有答复”。我不明白为什么前面的数字不能大于调查1中的所有响应。 – Quassnoi

回答

3
SELECT ra.* 
FROM responses rd 
JOIN responses ra 
ON  (ra.id_s, ra.id_p) = (rd.id_s, rd.id_p) 
WHERE (rd.id_q, rd.answer) = (3, 'D') 
+0

有趣,以前没有见过这种表达形式。它叫什么,所以我可以搜索更多的东西来阅读它? – Erics

+0

@Erics:你到底在说什么? – Quassnoi

+0

(name1,name2)=(value1,value2) – Erics

1

试试这个:

SELECT r2.* 
FROM Responses r2 
    INNER JOIN (Responses r 
    INNER JOIN Question q ON r.id_Q = q.id_Q 
    INNER JOIN Participants p ON p.id_P = r.id_P) r1 ON r2.id_P = r1.id_P 
WHERE q.id_Q = 3 
AND r.Answer = 'D'; 
+0

我会试一试,谢谢。这里有什么基本的想法? – Erics