【问题标题】:Query for small survey to do a benchmark test查询小型调查以进行基准测试
【发布时间】:2012-01-17 20:00:08
【问题描述】:

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

用户回答 - ID - 用户身份 - question_id - answer_option - 答案值

因为有些问题是多项选择,而其他问题不是我选择了两个字段而不是一个字段来存储所选选项(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 中的百分比,但这需要我两个查询来完成。所以我想知道是否有人对如何做得更好并可能在一个查询中做到这一点有一些建议。

【问题讨论】:

  • 放下一切,去了解第三范式 - en.wikipedia.org/wiki/Third_normal_form。您的数据库设计不正确,这就是您无法查询它的原因。
  • 感谢您的提示,我阅读了 wiki,但我看不出我的数据库有什么问题。有四个表:问题、问题选项、用户和用户答案。在 useranswers 表中,我们不使用 questionoption id,而是使用 answer_option 值,因为这对我们自己和我们的合作伙伴来说更清楚。不幸的是,我无法更改数据库的大部分内容,因为我不是这样设计的 :)
  • 我很乐意帮助您在数据结构范围内编写查询。但是,在您的查询中,您引用了 useranswers 表中的两列:您之前没有提及或解释的“utdvalue”和“utdchecked”。您能否详细说明这些列代表什么?
  • 对不起,我搞砸了。 utdvalue 应该是 answer_option 并且 utdchecked 应该是 answer_value。所以 answer_option 是复选框 / 单选按钮, answer_value 是 1/0,这取决于是否选择了 checbkox / 单选按钮。谢谢您的帮助! :)

标签: mysql sql database group-by


【解决方案1】:

对不起,作为这个选项的迟到者......但应该相对简单,但最好查看一些示例数据以了解复选框选项与单选(多项选择)按钮。您可以为每个想要计数的“条件”使用 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()。 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...

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多