2010-01-22 78 views
7

I asked a question yesterday關於使用MySQL計算結果以進行調查。如何在同一行中選擇多個字段? (MySQL)

現在我的問題是,如果我有一個調查問題表,一個調查選擇表和一個用戶表回答這些調查問題的表格,我將如何選擇調查問題以及該調查的所有選項在同一個查詢中?

問題表

question_id (int) 
question (text) 

選擇表

choice_id (int) 
question_id (int) 
choice_text (varchar) 

答案表

answer_id (int) 
question_id (int) 
choice_id (int) 

什麼選擇,我應該做的就是與所有的選擇對於調查沿(調查問題已知或未知數量)都在同一個查詢中? (如果可能的話,也可以在我的其他問題中發現數學問題,在同一個查詢中)

我不是那麼高級的MySQL。

感謝

編輯: 對不起,我的意思是,我試圖讓一個SELECT語句來選擇的問題,以及相應的對這個問題的所有選擇,在一排。

如果我這樣做

SELECT question_id, question, choice_id, choice_text FROM questions LEFT JOIN choices USING(question_id) 

我得到多行,每個choice_id。

結果應該是這樣的

question  choice_1 choice_2 choice_3 
A or B or C  A   B  C 

數學部分清點了結果調查,是的,在choice_id是PK,有沒有什麼幫助。

+0

你只是想要chocies,還是計數?什麼是你的「其他問題」,你想做什麼「數學」? – 2010-01-22 22:46:51

+0

您沒有在尋找任何關於正確答案的信息?只是問題/選擇的可能性? – 2010-01-22 22:49:47

+0

@Evan:這是一項調查,而不是測試 - 沒有正確的答案。 – Martha 2010-01-22 22:51:41

回答

4

要獲得每個問題的問題和選擇:

SELECT question, choice_text 
FROM questions 
JOIN choices 
ON questions.question_id = choices.question_id 

添加之前LEFT JOIN,如果你也想的是沒得選擇的問題。

要獲得計數每個答案你可以這樣做:

SELECT question, choice_text, COUNT(answers.choice_id) 
FROM questions 
JOIN choices 
    ON questions.question_id = choices.question_id 
LEFT JOIN answers 
    ON questions.question_id = answers.question_id 
    AND choices.choice_id = answers.choice_id 
GROUP BY questions.question_id, choices.choice_id 
ORDER BY questions.question_id, choices.choice_id 

要得到的是選擇的每一個答案(每題),請使用以下查詢百分比人數:

SELECT question, choice_text, COUNT(answers.choice_id) * 100/questiontotal 
FROM questions 
JOIN (
     SELECT questions.question_id, COUNT(answers.choice_id) AS questiontotal 
     FROM questions 
     LEFT JOIN answers ON questions.question_id = answers.question_id 
     GROUP BY questions.question_id 
    ) AS answercounts 
    ON questions.question_id = answercounts.question_id 
JOIN choices ON questions.question_id = choices.question_id 
LEFT JOIN answers 
    ON questions.question_id = answers.question_id 
    AND choices.choice_id = answers.choice_id 
GROUP BY questions.question_id, choices.choice_id 
ORDER BY questions.question_id, choices.choice_id; 

下面是我用TESTDATA:

CREATE TABLE questions (question_id int, question nvarchar(100)); 
INSERT INTO questions (question_id, question) VALUES 
(1, 'Foo?'), 
(2, 'Bar?'); 

CREATE TABLE choices (choice_id int, question_id int, choice_text nvarchar(100)); 
INSERT INTO choices (choice_id, question_id, choice_text) VALUES 
(1, 1, 'Foo1'), 
(2, 1, 'Foo2'), 
(3, 1, 'Foo3'), 
(4, 2, 'Bar1'), 
(5, 2, 'Bar2'); 

CREATE TABLE answers (answer_id int, question_id int, choice_id int); 
INSERT INTO answers (answer_id, question_id, choice_id) VALUES 
(1, 1, 1), 
(2, 1, 1), 
(3, 1, 3), 
(4, 2, 4), 
(4, 2, 5); 

和輸出我上次查詢得到對這個數據:

'Foo?', 'Foo1', 66.6667 
'Foo?', 'Foo2', 0.0000 
'Foo?', 'Foo3', 33.3333 
'Bar?', 'Bar1', 50.0000 
'Bar?', 'Bar2', 50.0000 

在你的問題的更新中,你說你想返回一個問題的所有值在一行上。我會建議你做而不是嘗試做到這一點,而是使用我給你上面的方法。如果您需要向最終用戶提供一行數據,則可以使用PHP完成。

0
SELECT questions.question_id, questions.question, choices.choice_id, choices.question_id 
FROM questions, choices 
WHERE questions.question_id = choices.question_id 
AND questions.question_id = "Something" 

應該工作,我認爲。

2

請注意,Answers表可能不需要QuestionID列。

這會爲您提供問題文本,選擇文本以及每個選項的答案數量。

SELECT Questions.question, Choices.choice_text, Count(Answers.*) AS N 
FROM Questions INNER JOIN Choices ON Questions.question_id = Choices.question_id 
    LEFT JOIN Answers ON Choices.choice_id = Answers.choice_id 
GROUP BY Questions.question_id, Choices.choice_id 

編輯:除非你在SQL是非常,非常好,這可能是最好忘掉了「所有行」的一部分 - 除非每個問題選擇的數量不僅是已知的,但是常數,即使在這種情況下,也不容易。這實際上是一個顯示問題,因此在顯示結果時應對它。

+0

+1對於「全部一行」部分的建議。 – 2010-01-22 23:22:10

+0

我希望我可以給出另一個+1來指出不必要的QuestionID列。 – 2010-01-22 23:23:49

+0

不幸的是,你的查詢似乎並不適合我。我得到'你的SQL語法有錯誤;檢查與你的MySQL服務器版本相對應的手冊,在'*)附近使用正確的語法。AS N 從問題 INNER JOIN選擇第1行的Questions.question_id = Choices.q' – 2010-01-22 23:25:47

3

我會建議馬克·拜爾斯的回答,雖然理論上如果你需要他們「全部在一行中」只是爲了查看的目的,而不是你可以做的PHP例程的一部分。

SELECT question, GROUP_CONCAT(choice_text) as choice_texts 
FROM questions 
JOIN choices 
ON questions.question_id = choices.question_id 
GROUP BY question; 

輸出將

'Foo?', 'Foo1,Foo2,Foo3' 
'Bar?', 'Bar1,Bar2' 

筆記「Foo1和Foo2,Foo3」將返回一列沒有三列,並GROUP_CONCAT默認最多有1024個字符在它的輸出,雖然它可以增加。它不建議,如果結果可能很大

相關問題