Вопрос по mysql, database – Сравните сходства между двумя наборами результатов

3

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

У меня есть «как» таблица, которая имеет 2 столбца «id_user», «id_artist». Вот пример того, как я хотел бы, чтобы это работало:

<code>User 1 likes:
1, 12
1, 13
1, 14
1, 26
1, 42
1, 44

User 2 likes:
2, 13
2, 14
2, 15
2, 26
2, 42
2, 56
</code>

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

Моей первой идеей было объединить лайки таким образом: & quot; 12,13,14,26,42,44 & quot; в строке, и использовать MySQL оценки FULLTEXT для сравнения различных строк. Это не сработало ... не знаю почему, но полный текст mysql работает только с текстом ... не с числами ...

Любая идея или любая подсказка будет высоко ценится.

Ваш Ответ

2   ответа
2

SELECT first_user.id_user, second_user.id_user, COUNT(first_user.id_user) AS total_matches

FROM likes AS first_user

JOIN likes AS second_user
ON second_user.id_artist = first_user.id_artist
AND second_user.id_user != first_user.id_user

GROUP BY first_user.id_user, second_user.id_user

ORDER BY total_matches DESC

LIMIT 1

Обратите внимание, что это не очень эффективно. Один из способов обойти это состоит в том, чтобы создать «кеш-таблицу». содержащий выходные данные этого запроса сLIMIT 1 часть удалена Добавьте некоторые соответствующие индексы и выполните запрос к этой таблице кеша. Вы можете установить задание cron для периодического обновления этой таблицы.

Пример:

CREATE TABLE IF NOT EXISTS `likes` (
  `id_user` varchar(50) DEFAULT NULL,
  `id_artist` varchar(50) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `likes` (`id_user`, `id_artist`) VALUES ('8', '39'), ('8', '37'), ('4', '37'), ('8', '24'), ('8', '7'), ('4', '28'), ('8', '28'), ('4', '27'), ('4', '11'), ('8', '49'), ('4', '7'), ('4', '40'), ('4', '29'), ('8', '22'), ('4', '29'), ('8', '11'), ('8', '28'), ('4', '7'), ('4', '31'), ('8', '42'), ('8', '25'), ('4', '25'), ('4', '17'), ('4', '32'), ('4', '46'), ('4', '19'), ('8', '34'), ('3', '32'), ('4', '21')

+---------+---------+---------------+
| id_user | id_user | total_matches |
+---------+---------+---------------+
| 8       | 4       |             7 |
+---------+---------+---------------+
Error: User Rate Limit Exceeded MonsieurNinja
Error: User Rate Limit Exceeded
0

минимум для одной из двух «копий» таблицы, чтобы ваш запрос не был неоднозначным.)

Таким образом, с учетом двух пользователей, вы можете найти «лайки» они имеют общее, делая соединениеlike Стол к себе. Вы также можете определить, какая доля лайков пользователя 1 является общей для пользователя 2, выполнив левое объединение и посчитав, сколько результатов и сколько пустых. Обратите внимание, что это не симметричная операция, и вам нужно будет рассмотреть случай, когда одно или оба числа равны 0.

Когда вы говорите, что хотите «найти наиболее похожих людей в базе данных»: вы можете сделать это для каждой пары пользователей, но учтите, что если у вас естьn пользователи тогда это включает в себя делатьn*(n-1)/2 сравнения, который имеет порядокn в квадрате. Это может быть довольно много работы для вашей базы данных, если у вас много пользователей.

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