'自动提示'功能实现了webapp

时间:2012-10-17 14:46:17

标签: sql ruby

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

我将拥有的是“自动提示”功能。例如,如果我作为用户将某个项目标记为好,系统应该建议我最可能也标记为好的项目。自动提示的合理标准是有多少用户喜欢第一个项目,就像另一个用户一样。如果所有喜欢喝茶的用户也喜欢茶壶 - 那么茶壶就是自动提供的最佳位置。

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

感谢您提供相关信息!

UPD

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

那么在SQL中看起来怎么样?

让我们看看它在SQL中的表现如何:

第1步:获取收藏夹的ID

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

第2步:获取喜欢相同项目的用户

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来实现它会非常慢,甚至更复杂,所以我建议您按原样使用查询。