2015-12-20 1 views
-1

Закажите более высокий процент соответствия проверке 30 столбцов mysqlВыберите наиболее подходящие результаты из n столбцов

Я хотел бы сделать проект, соответствующий проекту. Цель состоит в том, чтобы вернуться, скажем, 100 результатов, соответствующих лучшему проценту в первую очередь. декорации -

A user has yes or no answer of 30 questions(all answered). 
User is interested to see 100 people who has matching with him order by higher percentage 

мне нужно предложение, чтобы решить, как я буду делать таблицы и запросы обеспечивают минимальную обработку груза -

Должен ли я хранить ответы в отдельных столбцах (значение да/нет в каждом столбце) или в том же столбце, разделенном запятой (только да отвечает образованным, высоким, богатым, одиноким, заботливым)?

Каким должен быть запрос для таблицы A и таблицы B, чтобы вернуть наивысший порядок совпадения в процентах.

Вот таблица (ответы на 30 основных вопросов, да/нет тип ответа)

.id | name | q01 | q02 | q03 | q04 | q05 | q06 |...continue...| q30 

11 .|. tom ..|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 1 

12 .|. mik ..|.. 0 ..|.. 0 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 0 ..|..... ............. |. 0 

13 .|. jim ...|.. 1 ..|.. 1 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 1 

14 .|. don ..|.. 0 ..|.. 1 ..|.. 1 ...|.. 0 ..|.. 0 ..|.. 0 ..|..... ............. |. 1 

15 .|. ric ....|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 0 

16 .|. jam ..|.. 0 ..|.. 1 ..|.. 0 ...|.. 0 ..|.. 0 ..|.. 0 ..|..... ............. |. 1 

17 .|. joe ...|.. 1 ..|.. 1 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 0 ..|..... ............. |. 1 

18 .|. ima ..|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 1 

19 .|. sun ..|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 0 

20 .|. dim ..|.. 0 ..|.. 0 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 0 ..|.... .............. |. 0 

21 .|. dic ...|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|.... .............. |. 1 

xx .|. yyy ...|.. up to fifty thousand rows.. ...... |....................|. 

х user (example:id 15) хотел бы получить 100 результат заказан лучший матч с ним (q01 до Q30 столбцов совпадение). Наивысший процент матча должен быть первым.

Пожалуйста, помогите мне сделать запрос

SELECT * FROM таблицы WHERE условие ORDER BY соответствие условию LIMIT 0.100

Каковы условия, что мне нужно?

ответ

0
  • Совершенные матчи:

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

Таблица должна выглядеть следующим образом:

user_id q1 q2 ... qn accumulator (>n bits) 
1   red no  yes 100110101 
  • Приблизительные матчей:

При использовании битового индекса, вы должны искать все х битные варианты ключа. Где x/Number_of_questions * 100 - минимальный процент.

EX: 1 бит изменения ключей: от 101 вы бы 001, 111, 100.

Если разные вопросы имеют разный вес, вы наклоненная фактор это на уровне приложений.

Я предлагаю вам нормализовать таблицу ответов в случае, если номер вопроса не является статичным (в случае если вы захотите добавить или удалить вопросы позже). Это зависит от механизма хранения (это не должно быть проблемой для MongoDB).

Опять же, используя аккумулятор, таблица должна выглядеть следующим образом:

user_id answer_id accumulator (>n bits) 
1  1   100110101 

Теперь, когда вы ищете, вы XOR свой результат и своего рода этим.

SELECT * FROM answers ORDER BY BIT_COUNT(myAnswer^accumulator) ASC; 
1

Если вместо 30 столбцов, вы имели INT UNSIGNED, с 30 0/1 значения означает нет/да, ...

BIT_COUNT(XOR(col, to_match_against)) 

говорит, сколько битов не согласен

С этого момента вы можете вычесть из 30 и делить на 30 и умножить на 100, чтобы получить процент соглашение. Затем ORDER BY.

 Смежные вопросы

  • Нет связанных вопросов^_^