2009-01-09 42 views
2

我有一個查詢,從一個表中提取問題,並從另一個答案。我如何使這個查詢更容易寫

SELECT 
    questions.question, 
    questions.answers, 
    (SELECT COUNT(answer) FROM answers WHERE question_id = 1 AND answer = 1 
      GROUP BY answer) as ans1, 
    (SELECT COUNT(answer) FROM answers WHERE question_id = 1 AND answer = 2 
      GROUP BY answer) as ans2 
FROM questions 
WHERE questions.id = 1 

雖然這工作我不喜歡添加額外的子查詢每個答案的想法(questions.answers是一個逗號分隔的可能的答案的字符串)。這是可行的,但我相信必須有更好的方法。主要的是不同的問題有不同數量的答案。

有沒有更好的方法來做到這一點,或者這是一種可以接受的做事方式?我可以想象,查詢中的多個子查詢在將來可能會有(小)性能下降(不是我還在進行性能測試)。

如果適用,我不指望每個問題的答案不會超過5個。

回答

8
SELECT q.question, q.answers, 
    SUM(a.answer = 1) AS ans1, 
    SUM(a.answer = 2) AS ans2 
FROM questions q 
LEFT OUTER JOIN answers a ON (q.id = a.question_id) 
WHERE q.id = 1 
GROUP BY q.id; 
+0

這是一個更清潔 - 我認爲我必須爲每個問題的答案添加某種總和或子選擇然後呢? – Ross 2009-01-09 22:14:51

2

對我來說這看起來不錯。您可以省略子查詢中的「group by」子句,因爲您只選擇一個「answer」值。

如果您保存每個答案的可能答案列表,我懷疑可能會有一些與您的模式有關的問題。這可能應該放在一個單獨的表格中,每個答案由單個行表示。定界符分隔的字符串在數據庫設計中是一個很大的代碼嗅覺,就像你期望的相同的數據重複一樣。

+0

我只是認爲它是矯枉過正,只是爲了可能的答案而添加一個新表格,因爲它們最多隻會有一兩個單詞。我正在考慮它,因爲我不必限制我在這種情況下使用的標點符號;-) 感謝GROUP BY筆記。 – Ross 2009-01-09 22:10:10

+0

通過標準化答案欄,您將會爲自己做出巨大的貢獻。我曾經在一個完全像你的系統上工作(以這種方式存儲問題答案)。這是地獄。 – rmeador 2009-01-09 22:18:08

0

你不能使用?

SELECT 
    questions.question, 
    questions.answers, 
    COUNT(answer) 

FROM questions inner join answers 
on questions.id = answer.question_id 
WHERE questions.id = 1 
GROUP BY 
questions.question, 
questions.answers 

你會得到行而不是列,但有類似的結果。

1

也許?

SELECT 
    questions.question, 
    questions.answers, 
    (case when answers.answer = 1 then COUNT(answer) end) as ans1, 
    (case when answers.answer = 2 then COUNT(answer) end) as ans2 
    FROM questions left join answers on answers.question_id = questions.id 
    WHERE questionss.id = 1 
    group by questions.id 
0

將一個表中的多個行鏈接到另一個表中的一個或多個行的標準方法是使用鏈接表。這樣的表格將在其每行中存儲來自一個表格的ID和來自另一個表格的與第一個表格相關的ID。

爲了您的問題和答案,存儲在一個鏈接表可能的答案的一個問題(我可能會叫question_answered)力量看起來是這樣的:

question_id | answer_id

1 1

1 2

2 3

4 4

4 5

4 6 `

正如你所看到的,問題1有兩個可能的答案,問題2有1個可能的答案,問題3一直沒有得到答覆,而第4個問題接受了3個不同的答案。

雖然我不知道「的回答= 1」或「答案= 2」的意思是在你的情況下,使用鏈接表中的所有問題的答案計數的一個問題是很容易的:

SELECT question, count(answer_id) FROM questions AS q INNER JOIN question_answered AS qa ON qa.question_id = q.id) GROUP BY q.id

0
 SELECT questions.question, 
         questions.answers, 
         A.answer, 
         COUNT(A.answer) 
     FROM  questions Q 
LEFT JOIN  answers A 
      ON  Q.id = A.question_id 
    WHERE  questions.id = 1 
      AND  A.answer IN (1,2) 
GROUP BY  A.answer