【问题标题】:SQL: how to suggest likes with a relevance based on other users likes?SQL:如何根据其他用户的点赞来推荐具有相关性的点赞?
【发布时间】:2018-07-26 02:47:02
【问题描述】:

每个用户都可以使用自定义权重添加其喜欢

“我喜欢香蕉 (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 循环所有记录,但这是不对的。

是否有任何最佳实践或算法?有什么想法吗?

提前致谢!

重要提示:我找到了this 和其他示例/重复项来实现我所需要的。我可能会将此问题检测为重复问题,但我对最新的最佳做法感兴趣。许多解决方案已有 10 年的历史。

【问题讨论】:

  • 您是否有机会提供包含架构和示例数据的 SQL 小提琴?
  • SQL fiddle 供任何想要破解的人使用 - sqlfiddle.com/#!9/866825/2

标签: mysql sql database algorithm data-analysis


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多