Diversia
@Diversia

Как сравнить записи по свойствам?

Пользователи проходят тест, состоящего из 40 вопросов у которого НЕТ ПРАВИЛЬНОГО ответа, сохраняются просто варианты ответов. Вопросы с один вариантом ответа. Кол-во пользователей прошедших тест (кол-во результатов) может быть десятки тысяч. Каждый новый пользователь проходит тест, а результат заносится в таблицу (т.е. со временем появляются новые).
Пользователь добавил свой результат, который нужно сравнить с другими результатами и вывеси таблицу с сортировкой от лучшего к худшему (наиболее подходящему). Как оптимально с точки зрения производительности решить эту задачу?

Важно! Каждый новый пользователь со свои результатом - это эталон правильных ответов по отношению к другим.

Вариант 1 (неудачный). Создать таблицу со 40 свойствами. Заполним ее 10000 записями (к примеру). Далее выбираем одну из записей и сравниваем ее с остальными. Т.е. будет фильтр по записям (полям записи). В этом варианте будут выбраны только точно совпавшие записи и не будет возможности построить таблицу с сортировкой от лучшего к худшему.

Вариант 2 (неудачный). Через цикл открывать каждую запись и сравнивать свойства, создавая новый массив для построения таблицы. Но записей много и сервер загнется.
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 2
Minifets
@Minifets
Hello world!!!
Есть 1 финт, с помощью которого можно реализовать вашу задачу, сортировать по расстоянию Левенштейна. Я дам вам пример на php. Думаю как это реализовать на стороне sql сами найдете:

$me = '1111111111';
$results = [
    '2222222222',
    '1111211141',
    '1111111111',
    '1111112111',
    '1121111111'
];

// ASC
usort($results, function ($a, $b) use ($me) {
    return levenshtein($me, $a) > levenshtein($me, $b);
});
var_dump('ACS', $results);

// DESC
usort($results, function ($a, $b) use ($me) {
    return levenshtein($me, $a) < levenshtein($me, $b);
});
var_dump('DESC', $results);


P.S. Сам алгоритм в данному случае не совсем подойдет, но можно сделать похожий не него.
Ответ написан
Konata69lol
@Konata69lol
backend developer (php/go)
Надо было сразу уточнить, что без вариантов ответа.
Создать таблицу со 40 свойствами.

Это излишне. Вижу такую структуру.

Таблица с вопросами: id, текст вопроса,
Таблица с ответами: id, id вопроса, id юзера, ответ, флаг эталона
Таблица со статистикой: id, id юзера, счет (% эталонных ответов)

1ая таблица будет неизменна (пока не добавятся новые вопросы)
во 2ой будут добавлятся новые ответы, а при новом эталоне будут меняться флаги.
в 3ей будет пересчет после обновления эталона, на основе неё можно сортировать юзеров по счету
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы