SQL: как предложить лайки с релевантностью на основе лайков других пользователей?

0

каждый пользователь может добавить свои предпочтения с настраиваемым весом.

"Мне нравятся бананы (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 лет.

  • 2
    Есть ли шанс, что вы можете предоставить скрипту SQL схему и примеры данных?
  • 1
    SQL скрипка для всех, кто хочет иметь трещину - sqlfiddle.com/#!9/866825/2
Теги:
database
algorithm
data-analysis

1 ответ

1
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню