查询小型调查以进行基准测试

时间:2012-01-17 20:00:09

标签: mysql sql database group-by

我已使用此表设置了一个小型自定义调查,其中保存了用户的答案:

useranswers - 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来解决,但这没有用。三行的输出,这是正确的,但我想要一个值。

Btw utdvalue总是唯一的,这就是为什么我没有在第二个查询中使用question_id

现在的问题是,如果我修复了第二个查询,我能够计算PHP中的百分比,但这需要我两个查询才能做到这一点。所以我想知道是否有人建议如何做得更好,并可能在一次查询中做到。

1 个答案:

答案 0 :(得分:0)

很抱歉作为这个选项的后来者......但是应该相对简单,但是最好看一些样本数据来理解那些是复选框选项和无线电(多选)按钮。您可以为需要计数的每个“条件”使用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...