代码之家  ›  专栏  ›  技术社区  ›  Mr. B.

SQL:如何根据其他用户的喜好,提出相关的喜好建议?

  •  0
  • Mr. B.  · 技术社区  · 6 年前

    每个用户都可以添加 喜欢 用一个 定制重量 .

    “我喜欢香蕉(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年的历史。

    1 回复  |  直到 6 年前
        1
  •  1
  •   fubar    6 年前

    此查询将查找与给定用户共享一个或多个喜好的其他用户的所有喜好。然后,它将选择这些用户的平均相似权重,以确定每个相似的相关性。

    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