【问题标题】:SQL recommendation systemSQL推荐系统
【发布时间】:2012-12-19 06:58:54
【问题描述】:

目前,我已经从 last-fm 数据集中的一个子集中过滤掉了所有噪音,并且我正在尝试在这个子集之上构建一个推荐系统。

基本上我的数据集在数据库中包含以下内容:

用户名 |艺术家 |艺术家 |全场比赛

例子:

00000c289a1829a808ac09c00daf10bc3c4e223b 8bfac288-ccc5-448d-9573-c33ea2aa5c30 红辣椒691

我想要实现的是所有用户的列表以及他们听过特定艺术家的总播放次数。 例如,包含红辣椒的整数 (totalplays) 的列表。 问题在于,当我查询以下内容时:

SELECT userid, totalplays FROM dataset WHERE artist = 'red hot chili peppers'我只会获取至少听过红辣椒1次的用户(数据集不包含从未听过艺术家的用户条目)。

我希望它也包含这些整数,以便将其中两个结果集与 Pearson 相关性进行匹配,以便我可以构建推荐系统。 (我已经实现了)。

我尝试构建一个临时表,其中包含所有不同的用户 ID,然后使用数据集上的内部连接更新播放量;但不幸的是,这需要很长时间。

我听说过 SQL 中的IF EXISTS 可能性,但我并不熟悉它们。谁能指出我正确的方向?

再次:例如,我想获取名为“红辣椒”的艺术家的用户的总播放次数(无需计算总和,因为我已经完成了!)。即使用户在数据集中没有收听他们的记录(因此为该用户返回 0)。

提前致谢!

【问题讨论】:

  • 为什么要存储多余的艺术家信息? artistid 应该够了
  • 有时由于某些奇怪的原因,artistid 为空。然而,它用于不同的目的。该网站需要所有这些列;)

标签: mysql sql system recommendation-engine


【解决方案1】:

试试这个

SELECT A.USERID, coalesce(X.totalplays,0) totalplays
FROM (SELECT DISTINCT USERID FROM dataset) A
LEFT OUTER JOIN  (
SELECT userid, totalplays FROM dataset 
WHERE artist = 'red hot chili peppers') X ON A.userid = X.userid

如果你有单独的用户表,那么

SELECT A.USERID, coalesce(X.totalplays,0) totalplays
FROM UserTable A
LEFT OUTER JOIN  (
SELECT userid, totalplays FROM dataset 
WHERE artist = 'red hot chili peppers') X ON A.userid = X.userid

【讨论】:

  • 非常感谢!有没有办法将默认的 null 更改为 0?因为这将使我对 Pearson 相关性的实现保持不变!
猜你喜欢
  • 2014-06-10
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多