SQL:根据其他记录的用户喜欢获取记录

时间:2013-12-04 18:42:18

标签: sql sql-server tsql

我正在尝试编写一个SQL(Windows服务器)查询,该查询将根据其他用户的喜好提供一些结果。

有点像在亚马逊上说“买这个的用户也买了......”

它基于投票字段,投票'1'表示用户喜欢记录;或者投票'0'意味着他们不喜欢它。

因此,当用户在特定记录上时,我想列出其他3个喜欢当前记录的用户也喜欢的记录。

下面提供的相关表格的片段:

            ID  UserID      Record ID   Vote   DateAdded
            16  9999        12013011290  1     2008-11-11 13:23:44.000
            17  8888        12013011290  0     2008-11-11 13:23:44.000
            18  7777        12013011290  0     2008-11-11 13:23:44.000
            20  4930        12013011290  1     2013-11-19 15:04:06.263

我认为这需要通过子选择进行排序,但我不确定。任何人都可以告诉我这是否可能,如果是这样,如何!感谢。

P.S。 为了保持结果的质量,我认为通过DateAdded进行过滤会非常有用。那是,   - 'user x'正在查看有关'record z'的推荐记录   - '用户y'是喜欢'记录z'和'记录'的人   - 只计算'用户y''喜欢的'记录'如果他们喜欢'在他们喜欢'记录之前或之后记录一个小时Z”   - 换句话说,如果它与'record z'在同一个网站浏览会话期间,只计算'记录'

希望这是有道理的!

2 个答案:

答案 0 :(得分:0)

这样的事情?

select r.description
from record r
join (
     select top 3 v.recordid from votes v
     where v.vote = 1 and recordid != 123456789
     and userid in
       (
          select userid from votes where recordid = 123456789 and vote =1
       )
     order by dateadded desc  
) as x on x.recordid = r.id

答案 1 :(得分:0)

我用于此问题基本版本的方法确实使用了多个选项:找出用户喜欢某个特定项目的内容,然后进一步查询他们标记的内容。

with Likers as
   (select user_id from likes where content_id = 10)
select count(user_id) as like_count, content_id
   from likes
   natural join likers
   where content_id <> 10
   group by content_id
   order by like_count desc;

(使用Sqlite3测试)

您将收到的是喜欢项目10的所有人喜欢的项目列表,按喜欢的数量(在搜索域内)排序。我可能也希望限制此项,因为在更大的数据集上它可能导致大量的流浪物品只有一两个相似的喜欢,而这些喜欢又被埋藏在数百种喜欢的物品中。

我怀疑你首先检查时间戳的原因是,如果有人喜欢洗衣粉,然后两天后回来喜欢看电影,系统就不会联想喜欢Epic Shootout 17的人也喜欢Clean More。&#34;

我不建议使用日期算术。我可能会建议创建另一个表来表示个人&#34;会话&#34;并使用session_id执行此任务。由于(希望!)很多很多人都喜欢数据库中的记录,因此您希望减少正在进行的工作量。您还可以使用此session_id来记录一个人执行的任何其他操作(用于分析目的。)使用简单索引请求会话中发生的所有事情也在计算上更便宜和身份比较,而不是对潜在的数百万条记录进行日期计算。

供参考,Piwik defines a new session as thirty minutes since the last action taken