Запрос для небольшого опроса, чтобы сделать тест теста - PullRequest
1 голос
/ 18 января 2012

Я создал небольшой пользовательский опрос с этой таблицей, в которой сохраняются ответы пользователей:

useranswers - Я бы - Идентификатор пользователя - question_id - answer_option - answer_value

Поскольку некоторые из вопросов имеют множественный выбор, а другие нет, я выбрал два поля вместо одного для хранения выбранных опций (answer_option и answer_value). Используются только флажки и переключатели, поэтому answer_value всегда равно 1 или 0, а answer_option имеет идентификатор элемента checkbox / radio.

Теперь я хотел бы провести тестирование производительности, например на 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, но для этого мне понадобится два запроса. Поэтому мне было интересно, есть ли у кого-нибудь предложения о том, как сделать это лучше и, возможно, сделать это одним запросом.

1 Ответ

0 голосов
/ 20 января 2012

Извините, что опоздал на эту опцию ... но ДОЛЖЕН быть относительно простым, но было бы лучше увидеть некоторые примеры данных, чтобы понять те, которые являются опциями флажка по сравнению с кнопкой радио (множественный выбор).Вы можете использовать конструкцию 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 = ДА или Проверено), и вам важны только «option_a» или «option_b».

Выбор FIELD выполняет суммирование () для каждой строки.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...
...