2012-01-17 49 views
1

我已經建立了與此表一小自定義調查,其中用戶的答案被保存:查詢的小調查做基準測試

useranswers - ID - user_ID的 - question_id - answer_option - answer_value

因爲一些問題是多項選擇而其他問題不是我選擇了兩個字段而不是一個存儲所選選項(answer_option和answer_value)。僅使用複選框和單選按鈕,因此answer_value始終爲1或0,answer_option具有複選框/單選項的ID。

現在我想要做的是基準測試,例如question_id 1.例如,我想查看有多少用戶選擇了'option_a'或'option_b'的百分比。但是,我現在很困惑該怎麼做?是否有可能在一個查詢中做到這一點,如果是這樣的話?

因爲有些用戶可以在調查中離開,所以我不能指望用戶將其作爲總價值。所以我做了以下得到整體價值:

SELECT COUNT(*) FROM `useranswers` WHERE `question_id` = '1' AND answer_option = 'option_a' 

這給了我參加了question_id 1的總用戶現在的問題是我如何計算已選定「option_a」或用戶的數量'option_b'。

當我使用此查詢:

SELECT FROM useranswers WHERE (answer_option = 'option_a' AND answer_value = 1) OR (answer_option = 'option_b' AND answer_value = 1) 

然而,這個查詢給我回4,而現在只有三個用戶。我認爲這將通過添加一個GROUP BY user_id來解決,但是這並沒有解決。那三行的輸出是正確的,但我希望返回一個值。

順便說一句utdvalue始終是唯一的,這樣這就是爲什麼我沒有在第二個查詢

現在使用question_id的事情是,如果我得到的第二個查詢固定的,我能計算出PHP的百分比,但這需要我兩個查詢來做到這一點。所以我想知道如果有人有一些建議,如何做得更好,並可能在一個查詢中做到這一點。

+0

放下一切,去了解第三範式 - http://en.wikipedia.org/wiki/Third_normal_form。你的數據庫設計不正確,這就是爲什麼你無法查詢它。 – Kenaniah 2012-01-17 20:28:57

+0

感謝您的提示,我閱讀了wiki,但我沒有看到我的數據庫出了什麼問題。有四個表格:問題,問題選項,用戶和useranswers。在useranswers表中,我們不使用questionoption id,而是使用answer_option值,因爲這對我們自己和我們的合作伙伴來說更加清晰。不幸的是,我不能改變很多數據庫,因爲我沒有這樣設計:) – Shiraz 2012-01-17 21:04:07

+0

我很高興幫助你在你的數據結構的範圍內編寫查詢。但是,在查詢中,您引用了useranswers表中的兩列:「utdvalue」和「utdchecked」,您之前沒有提及或解釋這些列。您能否詳細說明這些列代表什麼? – 2012-01-19 01:19:23

回答

0

對不起,作爲這個選項的後來者......但應該是相對簡單的,但會更好地看到一些示例數據,以瞭解那些複選框選項vs無線電(多選)按鈕。您可以使用SUM(IF())構建每一個「條件」你如要計數...

SELECT 
     sum(if(ua.answer_option = 'option_a', 1, 0)) as OptionACount, 
     sum(if(ua.answer_option = 'option_b', 1, 0)) as OptionBCount, 
     count(*) as TotalRecordsSelected 
    from 
     userAnswers ua 
    where 
      ua.question_id = 1 
     and ua.answer_value = 1 
     and ua.answer_option in ('option_a', 'option_b') 

WHERE子句明確要去看看只在問題1,其中的答案值1(假設1 = YES或者Checked),你只關心'option_a'或'option_b'。

FIELD選擇對每一行都執行sum()。總和內的IF()測試它正在計算哪個限定符...選項「A」或「B」。我相信它會得到不同的單選按鈕也更復雜,但概念是相似的......你可能只是需要展開IF()構建以包括

SUM(IF(answer_option = 'radio_optionX' and answer_value = 1, 1, 0)) as RadioOpXAnswer1Count, 
SUM(IF(answer_option = 'radio_optionX' and answer_value = 2, 1, 0)) as RadioOpXAnswer2Count, 
SUM(IF(answer_option = 'radio_optionX' and answer_value = 3, 1, 0)) as RadioOpXAnswer3Count, etc...