2016-05-30 2 views
1

У меня есть большой список предпочтений для пользователей в базе данных MySQL. Например,MySQL Preference Finder

User 2 - Preference 1 - yes 
User 3 - Preference 3 - no 
User 2 - Preference 3 - no 
User 6 - Preference 2 - yes 
User 3 - Preference 1 - no 

В принципе, я пытаюсь создать запрос, который будет иметь возможность подключить пользователя, и он будет найти пользователей с похожими предпочтениями. Например, подключив «пользователь 2» к вышесказанному, он вернет «пользователь 3», потому что они не разделяют предпочтения №3. Запрос должен найти несколько похожих пользователей и учитывать все предпочтения.

Как бы я мог сделать что-то подобное с использованием MySQL и PHP (при необходимости)? Что-нибудь помогает!

Спасибо!

+3

Итак, у вас есть три таблицы, описанные здесь. Какова ваша нынешняя схема? – tadman

+0

@tadman. Там должно быть 3 таблицы, но это строго одна таблица с тремя столбцами, две из которых могут быть внешними ключами. –

ответ

0

Ради простоты я определил простую таблицу, подобную той, что описана в вопросе, как это:

CREATE TABLE pref (
    user integer not null, 
    pref integer not null, 
    value bool default false, 
    primary key (user, pref) 
); 

Кроме того, я добавил следующие данные выборки:

INSERT INTO pref VALUES 
(2, 1, true), (3, 3, false), (2, 3, false), 
(6, 2, true), (3, 1, false); 

Принципиальная идея «аналогичных предпочтений» основана на концепции self-join, то есть присоединении таблицы предпочтений DB с самим собой. После того, как играл с ним, я быстро пришел к следующему SELECT заявление:

SELECT leftpref.user as leftuser, rightpref.user as rightuser, count(*) as score from pref leftpref 
INNER JOIN pref rightpref on leftpref.pref = rightpref.pref and leftpref.value = rightpref.value 
WHERE leftpref.user <> rightpref.user 
GROUP BY leftpref.user, rightpref.user 
; 

Это даст следующий результат:

leftuser rightuser score 
2  3   1 
3  2   1 

это именно то, что, как ожидается:

  • пользователя 2 делится одним преимуществом с пользователем 3
  • Вторая строка - это симметричное утверждение, которое пользователь 3 разделяет с нами предпочтение э 2.
  • Чем больше предпочтений делится два пользователя, тем выше оценка будет

«Подключение пользователя» можно было бы добавить еще один AND leftuser = <userid> для этого запроса.