我有一个只有一张表的数据库,如下所示:
UserID (int), MovieID (int), Rating (real)
userIDs 和 movieIDs 是很大的数字,但我的数据库只有许多可能值的样本(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 算法。 (任何其他将信息数据库放入简单的二维 float 组的建议都将不胜感激)
重要的是按顺序返回它,这样当我取回我的二维数组时,我将能够将这些值重新映射到相应的用户和电影以进行我的分析。
最佳答案
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 表中的 MovieID 值列表的笛卡尔积(哎哟!),然后将该完整矩阵与 Ratings 表进行外连接(再次)收集评级值。
这是不有效的。
这可能是有效的。
尽管只运行简单的数据选择,并在数据到达时安排填充数组,但您可能会做得更好。如果您有成千上万的用户和电影,您将返回数百万行,但其中大部分将有空值。您应该将传入数据视为稀疏矩阵的描述,首先将程序中的矩阵设置为全零(或其他默认值),然后从数据库中读取流并仅设置实际存在的行。
该查询基本上是微不足道的:
SELECT UserID, MovieID, Rating
FROM Ratings
ORDER BY UserID, MovieID;
关于sql - 电影评级数据库的新手 SQL 查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319649/