Какой лучший способ найти процентное соответствие среди ответов пользователей на вопросы? - PullRequest
2 голосов
/ 05 мая 2011

У меня есть набор ответов пользователей на предопределенный список вопросов, заданных как истинные, так и ложные. Данные выглядят так:

+---------+-------------+--------+----+
| user_id | question_id | answer | id |
+-------------------------------------+
|    4    |     110     |    0   | 1  |
|    4    |     111     |    1   | 2  |
|    4    |     112     |    1   | 3  |
|    4    |     113     |    0   | 4  |
|---------+-------------+--------+----|
|    6    |     110     |    0   | 5  |
|    6    |     111     |    1   | 6  |
|    6    |     112     |    0   | 7  |
|    6    |     113     |    0   | 8  |
+---------+-------------+--------+----|

Мне нужно найти 10 лучших совпадений для каждого пользователя (запустить один раз для каждого пользователя в системе). Таким образом, чтобы иметь возможность найти 10 других пользователей в порядке убывания наилучшего соответствия на основе ответов (то есть из приведенного выше примера, пользователь 4 и пользователь 6 совместимы на 75% на основе их ответов).

Вот несколько ограничений, которые, как мы надеемся, упростим:

  1. Каждый пользователь будет иметь не менее 10 ответов, которые необходимо учитывать.
  2. Каждый ответил на первые 10 вопросов

В идеале это должно быть в состоянии справиться с людьми, которые ответили на множество различных вопросов, которые могут быть не одинаковыми для всех (то есть они пропускают вопросы, на которые они не хотят отвечать.

Спасибо за любую помощь в этом! Я действительно в недоумении, что делать.

1 Ответ

1 голос
/ 05 мая 2011

Сначала я использую IF. Что-то вроде:

SELECT SUM(IF(a.answer=b.answer,1,0)) AS match, b.user_id 
FROM data_table AS a
JOIN data_table AS b ON a.question_id = b.question_id
WHERE a.user_id = n
AND b.user_id <> n
GROUP BY b.user_id
ORDER BY match DESC
LIMIT 10

Где n - идентификатор пользователя, который вы хотите протестировать

...