当前位置:  开发笔记 > 数据库 > 正文

电影评级数据库的新手SQL查询问题

如何解决《电影评级数据库的新手SQL查询问题》经验,为你挑选了1个好方法。

我有一个包含一个表的数据库,如下所示:

UserID (int), MovieID (int), Rating (real)

userID和movieID是大数字,但我的数据库只有许多可能值的样本(4000个唯一用户和3000个独特的电影)

我要对它进行矩阵SVD(奇异值分解),所以我想将这个数据库作为有序数组返回.基本上,我想按顺序返回每个用户,并为每个用户按顺序返回每个电影,然后返回该用户,电影对的评级,如果该用户没有评价该特定电影,则返回null.例:

USERID | MOVIEID | RATING
-------------------------
99835   8847874    4
99835   8994385    3
99835   9001934    null
99835   3235524    2
           .
           .
           .
109834  8847874    null
109834  8994385    1
109834  9001934    null

etc

这样,我可以简单地将这些结果读入二维数组,适合我的SVD算法.(将信息数据库转换为简单的二维浮点数组的任何其他建议将不胜感激)

重要的是按顺序返回,以便当我获得二维数组时,我将能够将值重新映射到相应的用户和电影以进行分析.



1> Jonathan Lef..:
SELECT m.UserID, m.MovieID, r.Rating
    FROM (SELECT a.userid, b.movieid
              FROM (SELECT DISTINCT UserID FROM Ratings) AS a,
                   (SELECT DISTINCT MovieID FROM Ratings) AS b
         ) AS m LEFT OUTER JOIN Ratings AS r
         ON (m.MovieID = r.MovieID AND m.UserID = r.UserID)
    ORDER BY m.UserID, m.MovieID;

现在测试,它似乎工作!

这个概念是在Ratings表中创建UserID值列表的笛卡尔积,并在Ratings表(ouch!)中创建MovieID值列表,然后用Ratings表(再次)执行该完整矩阵的外连接收集评级值.

不是有效的.

它可能是有效的.

您可能会做得更好,只需运行简单的数据选择,并安排在数据到达时填充数组.如果你有成千上万的用户和电影,你将返回数百万行,但其中大多数都会有空值.您应该将传入数据视为稀疏矩阵的描述,并首先将程序中的矩阵设置为全零(或其他默认值),然后从数据库中读取流并仅设置实际存在的行.

该查询基本上是微不足道的:

SELECT UserID, MovieID, Rating
    FROM Ratings
    ORDER BY UserID, MovieID;

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有