Оптимизировать запрос вопросов по сложности - PullRequest
0 голосов
/ 20 мая 2011

Я создаю вид, содержащий вопросы, которые нужно упорядочить по сложности.

Моя идея:

  • Сначала поставьте новые вопросы (менее 10 ответов)
  • Во-вторых, задайте вопросы, на которые нет неправильного ответа
  • Наконец остальные вопросы, упорядоченные по сложности

Способ расчета сложности: (ответ правильный / неправильный ответ)

Проблема в том, что я думаю, что будет выполнено много запросов по этому представлению, и я подозреваю, что этот запрос довольно медленный, и я не знаю, есть ли способ сделать это быстрее.

alter view questionLevel as select *, 0 as ordenacio from question where statsAnswerCorrect + statsAnswerIncorrect < 10
union
select *, 1 as ordenacio from question where 
statsAnswerCorrect + statsAnswerIncorrect >= 10
and statsAnswerIncorrect = 0
union
select *, 2 as ordenacio
from question where questionId IN (
select questionId from question where statsAnswerCorrect + statsAnswerIncorrect >= 10 
and  statsAnswerIncorrect > 0 )
order by ordenacio asc, ( statsAnswerCorrect / statsAnswerIncorrect) desc

Есть идеи?

1 Ответ

0 голосов
/ 20 мая 2011

Вы можете переписать третью часть объединения для ordenacio = 2 в виде простого запроса:

SELECT *, 2 AS ordenacio FROM question 
WHERE statsAnswerCorrect + statsAnswerIncorrect >= 10 
AND  statsAnswerIncorrect > 0

Также имейте в виду, что при упорядочении делением ваш делитель может быть равен 0, что означает, что mysql присвоит ему значение NULL и поместит в него строки в конце, если вы ORDER BY ... DESC, что, вероятно, не то, что вы хочу. Вместо этого используйте ORDER BY ( a/(b+1) ) DESC или ORDER BY ( a/(a+b) ) DESC.

Если вы хотите много использовать это представление, возможно, было бы лучше немного денормализовать вашу базу данных и добавить столбцы, содержащие тип вопроса и правильный процент, обновленный при вставке. Это действительно зависит от того, насколько большими должны быть ваши таблицы и сколько операций вставки вы ожидаете.

...