PHP - MySQL Search таблица базы данных возвращает результат с процентным соответствием - PullRequest
3 голосов
/ 29 октября 2011

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

Это делается путем учета интересов зарегистрированного пользователя (сохранение в db) и сопоставления с другим пользователем на сайте с использованием предложения MySQL WHERE. Но у меня проблемы с тем, как показать процент или оценку рядом с каждым пользователем, чтобы показать, насколько близко они соответствуют зарегистрированным интересам пользователя.

Например:

  • user1 - 60% соответствует вашему интересу
  • user1 - 30% соответствует вашему интересу
  • user2 - 20% соответствует вашему интересу

Каждый пользователь имеет 5 различных интересов, если все совпадения совпадают с его 100%.

Образец структуры таблицы:

CREATE TABLE IF NOT EXISTS `helloworld` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `like1` varchar(300) NOT NULL,
  `like2` varchar(300) NOT NULL,
  `like3` varchar(300) NOT NULL,
  `name` varchar(300) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

пример запроса:

SELECT * FROM helloworld WHERE like1='football' AND like2='art'

Я думал об использовании функции COUNT, но я не уверен? или я должен использовать подзапросы?

РЕДАКТИРОВАТЬ: я использую PHP для языка на стороне сервера. Пользователь не может набирать свои лайки, должен использовать предварительно определенный список.

Ответы [ 5 ]

0 голосов
/ 31 октября 2011

Это будет сделано с вашей текущей схемой:

select
    t2.id,
    t2.name
    sum(
        t1.like1 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like2 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like3 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like4 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like5 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5)
    ) * 20 as percent_match
from helloworld t1
left join helloworld t2 on t1.id != t2.id
group by 1, 2
order by 3 desc;

Это работает, потому что true в mysql равно 1 - суммирование истин даст общее количество совпадений.

0 голосов
/ 30 октября 2011

Вот как я это делаю.Предположим, что $ like1, $ like2 и $ like3 являются значениями от вашего текущего пользователя:

SELECT (IF(like1='$like1',1,0) + IF(like2='$like2',1,0) + IF(like3='$like3',1,0))/3*100 match_percent,
COUNT(id)
FROM helloworld
GROUP BY match_percent;
0 голосов
/ 30 октября 2011

Прежде всего, я думаю, что вам нужна другая схема. Тот, который у вас есть, сделает вашу задачу очень сложной, потому что она недостаточно гибкая. Я рекомендую что-то вроде этого:

CREATE TABLE `users` (
    `id`        INT NOT NULL AUTO_INCREMENT,
    `name`      VARCHAR(300) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `likes` (
    `user`      INT NOT NULL,
    `interest`  VARCHAR NOT NULL,
    PRIMARY KEY (`user`,`interest`)
);

(Извините, я не помню, как установить отношения FK в MySQL, но я уверен, что вы можете понять это достаточно легко.)

Затем, чтобы определить количество лайков для каждого пользователя:

SELECT COUNT(*)
FROM users
JOIN likes ON likes.user=users.id
WHERE users.name = 'bob';

Затем, чтобы определить, сколько лайков имеют два общих пользователя:

SELECT COUNT(*)
FROM users AS u1
JOIN likes AS l1 ON (l1.user = u1.id)
JOIN likes AS l2 ON (l1.interest = l2.interest)
JOIN users AS u2 ON (l2.user = u2.id)
WHERE u1.name = 'bob'
    AND u2.name = 'alice';

Затем, основываясь на этих трех числах, вы можете рассчитать свои проценты по своему желанию - возможно, в своем клиентском коде, но вы можете использовать подвыборы, чтобы сделать все это на стороне SQL, если хотите.

Пример:

USERS:
 id | name
----+-------
  1 | bob
  2 | alice

LIKES:
 user | interest
------+----------
    1 | fish
    1 | baseball
    2 | fish
    2 | cooking
    2 | baseball

Выполнение первого запроса для bob и alice покажет, что у bob есть интересы 2 , а у Алисы 3 . Затем выполнение второго запроса покажет, что они с Бобом и Алисой имеют общие интересы 2 .

Затем вы можете показать Бобу, что Алиса разделяет 100% его интересов (2/2 = 100%), и можете показать Алисе, что Боб разделяет 66% (2/3 = 66%) ее интересов.

0 голосов
/ 30 октября 2011

Вам лучше проверить это на уровне PHP.Учитывая интересы каждого пользователя, вы можете получить оценку с помощью count () по сравнению с результатом array_intersect () для сравнения интересов посетителя и других пользователей (http://www.php.net/manual/en/function.array-intersect.php). Если вы разрешите 5 интересов, это будетparams})))%. Без совпадений, 0%, за 4 совпадения, 80%.

0 голосов
/ 30 октября 2011

У вас есть отношения "многие к общению" между пользователем и лайками.Ваша таблица нарушает 1NF - у вас есть «повторяющаяся группа» из столбцов like.Вместо этого создайте отдельную таблицу ассоциаций :

create table user_likes (
    user_id int(9) NOT NULL,
    like_name varchar(300) NOT NULL
);

Теперь вы можете использовать более простые запросы, чтобы получить количество совпадений - я оставлю это для вас:)

Подсказка: вы можете использовать битовую маску, чтобы помочь определить совпадения, назначив предварительно определенную степень 2 для каждого отдельного like_name (help - таблица like_names).

...