2012-08-13 34 views
1

設定我有3代表我從中提取數據結果從兩個表中循環多次

表1:assignment_status

primary_key 
test_group_id | s_id | date_taken | status 
q1   | 123 | 2012-08-13 | completed 

表2:question_bank

foreign key unique key | 
group_id  | q_id  | question 
q1   | 1   | What is your name? 
q1   | 2   | Where were you born? 

表3 :assignment_answers

foreign key 
g_id   | q_id | s_id | s_answer 
q1   | 1 | 123 | Mark Johnson 
q1   | 2 | 123 | Florida 

現在我試圖顯示相應問題的答案。我面臨的問題是返回的結果集循環多次。

例如,如果question_bankassignment_answers有兩條記錄,每個結果集有4條記錄;如果兩者都有4條記錄,則每個結果集都有16條記錄。所以這個數字正在平方。這使我確信我以錯誤的方式拉它。下面是我的查詢,我使用:

SELECT 
    * 
FROM 
    assignment_status s, 
    question_bank b, 
    assignment_answers a 
WHERE 
    s.test_group_id = b.group_id = a.g_id = 'q1' 

我也試過

SELECT 
    * 
FROM 
    question_bank b, 
    assignment_answers a 
WHERE 
    b.group_id = a.g_id 
    AND b.group_id = 'q1' 
    AND a.g_id = 'q1' 

兩個查詢導致被重複相同的多個行。

任何建議,想法和想法?

在此先感謝。

+0

您試圖通過查詢回答的確切'問題'是什麼? (是的:誰回答了這個問題?)我想你可能也想用Distinct – MimiEAM 2012-08-13 11:19:42

+0

答案爲學生選擇的問題。例如:你叫什麼名字? - 學生回答'Mark'。你住在哪裏? - 學生回答'佛羅里達'。所以我想要顯示在頁 – asprin 2012-08-13 11:22:16

+0

哈我哈看到所以你需要添加條件b.q_id = a_q.id – MimiEAM 2012-08-13 11:24:46

回答

1

我認爲你缺少的question_bank B A狀況,assignment_answers一個

SELECT 
    * 
FROM 
    assignment_status s, 
    question_bank b, 
    assignment_answers a 
WHERE 
    s.test_group_id = b.group_id = a.g_id = 'q1' AND b.q_id = a_q.id 
+0

哦,是的..那是當場。不知道我是如何錯過它的。謝謝 – asprin 2012-08-13 11:28:17

+0

很高興幫助:) – MimiEAM 2012-08-13 11:29:53

0

你必須通過2列確定​​您的問題/答案,所以當你加入表,你應該使用它們。像這樣的東西可能做的伎倆:

SELECT as.s_id, as.date_taken, as.status, 
     qb.group_id, qb.q_id, qb.question, 
     aa.s_answer 
    FROM assignment_status as 
    JOIN question_bank qb ON as.test_group_id = qb.group_id 
    JOIN assignment_answers aa ON aa.g_id = qb.group_id AND aa.q_id = qb.q_id 
WHERE as.test_group_id = 'q1'; 

注意:你有不同的名稱在表中的列,像test_group_id <--> group_id <--> g_id。這被認爲是一種糟糕的風格,'當你的模式增長到數百個表格時,編寫查詢將會很困難。因此,類似地在不同的表中使用通用的命名模式和名稱列是一件好事。

+0

我已經得到了我需要的東西。無論如何感謝您的迴應。 – asprin 2012-08-13 11:45:07