каждый пользователь может добавить свои предпочтения с настраиваемым весом.
"Мне нравятся бананы (7/10) и яблоки (10/10)"
Я хотел бы предлагать понравиться пользователям, исходя из того, что другим пользователям нравится.
"Тебе нравятся бананы. Тебе могут нравиться и яблоки".
Таблицы SQL имеют следующую структуру:
# users
- id
- ...
# likes
- id
- label (e.g. "apple")
- ...
# user_likes
- id
- user_id
- like_id
- weight
Желаемый результат:
# 1. Suggestions for user ("You probably like apples!")
| like_id | relevance |
-----------------------
| 5 | 0.5 |
# 2. Suggestions for like ("Apples fit to bananas!")
| like_id | relevance |
-----------------------
| 5 | 0.8 |
Моя нынешняя идея состояла бы в том, чтобы зацикливать все записи с PHP, но это не может быть прав.
Есть ли какая-нибудь лучшая практика или алгоритм для этого? Любая идея?
Заранее спасибо!
Важно: я нашел это и другие примеры/дубликаты для достижения того, что мне нужно. Этот вопрос может меня обнаружить как дубликат, но меня интересует новейшая передовая практика. Многим решениям исполнилось 10 лет.
Этот запрос найдет всех подобных другим пользователям, которые делят один или несколько подобных друг другу с данным пользователем. Затем он будет выбирать средний вес, равный всем этим пользователям, для определения релевантности каждого из них.
SELECT
l.*, AVG(ul_3.weight) AS weight
FROM
user_likes ul_1
INNER JOIN user_likes ul_2
ON ul_1.like_id = ul_2.like_id
AND ul_1.user_id <> ul_2.user_id
INNER JOIN user_likes ul_3
ON ul_2.user_id = ul_3.user_id
INNER JOIN likes l
ON l.id = ul_3.like_id
WHERE
ul_1.user_id = 5
AND l.id <> ul_1.like_id
GROUP BY
l.id
ORDER BY
weight DESC;
Рабочая скрипта SQL с образцами данных - http://sqlfiddle.com/#!9/866825/2