1

我正在开发一个 Web 应用程序并有两个模型(除其他外) - 用户和具有多对多关联的项目。所以我有表'users','items'和'items_users',主键'id'和外键user_id和item_id。

我将拥有一个“自动建议”功能。例如,如果我作为用户将某个项目标记为好,则系统应该建议 n 个项目,我很可能也会将其标记为好。自动建议的合理标准是有多少用户喜欢第一个项目和另一个项目。如果所有喜欢喝茶的用户也喜欢茶壶 - 那么茶壶在自动建议中处于首位。

这是基本功能,我也会过滤一些结果,但其余的无关紧要。我正在考虑某种辅助表,用于按需快速计算或安排单独的进程来计算 n 个建议。

感谢您提供任何相关信息!

UPD

这个问题听起来不清楚。我有带有续集 orm 的 sql db 和 sinatra。我在问如何计算最相似的项目数据集(最便宜,资源消耗最少的方法)。你将如何实施它?

4

2 回答 2

0

因此,通常您希望选择所有喜欢相同产品的用户,然后通过计算每个产品的喜欢数量来获得他们喜欢的产品,并输出最喜欢的产品。

那么这在 SQL 中会是什么样子呢?

让我们看看这在 SQL 中会是什么样子:

第 1 步:获取您的收藏夹的 id

SELECT it.item_id FROM `item_users` it WHERE it.user_id = %current_user%

第二步:获取喜欢相同商品的用户

SELECT u.id FROM `item_users` it, `users` u WHERE it.item_id IN (  
    SELECT it.item_id FROM `item_users` it WHERE it.user_id = %current_user%  
) AND it.user_id != %current_user% AND u.id = it.user_id GROUP BY it.user_id

第 3 步:获取他们的最爱

整个 SQL 查询如下所示:

SELECT i.* FROM `items` i, `item_users` it WHERE it.user_id IN (  
    SELECT u.id FROM `item_users` it, `users` u WHERE it.item_id IN (  
        SELECT it.item_id FROM `item_users` it WHERE it.user_id = %current_user%  
    ) AND it.user_id != %current_user% AND u.id = it.user_id GROUP BY it.user_id  
) AND i.id = it.item_id GROUP BY i.id ORDER BY count(*) DESC

您的任务是添加对结果的限制...

更新:我猜您想首先获得最受欢迎的产品。我已更改查询以添加该功能(添加ORDER BY count(*) DESC到末尾)

这是一个复杂的查询,使用 ActiveRecord 来实现它会很慢,甚至更复杂,所以我建议您按原样使用查询。

于 2012-10-17T16:02:17.550 回答
0

使用您的链接表来连接用户和项目。在您的 WHERE 子句中应用以下过滤器:
- 喜欢该项目的用户(“标记为好”)
- 当前用户尚未标记为好的项目

按喜欢的数量降序排序(您需要按项目 ID 分组并计算用户数)。

于 2012-10-17T15:01:41.187 回答