问题描述
我正在尝试为每个推荐获取一个以逗号分隔的平均成绩列表,其中包含另一个以逗号分隔的推荐内容 ID 列表。推荐是一个对象,它由将接收推荐的内容 ( ContentID
) 和将被推荐的其他内容的列表 ( RecommendedContentIDs
) 组成。
表结构、样本数据和其他限制
我有一个两表数据库结构。第一个表包含保存为逗号分隔的排名列表的推荐内容 ID。第二个表包含每个推荐内容 ID 的等级。排名列表最多有 10 个逗号分隔值,等级范围从 0 到 5。
为了更好地说明问题,以下是表结构和一些示例数据:
Table Recommendations
|ID |ContentID |RecommendedContentIDs |Type |
+------+-------------+----------------------+-----+
|1 |2051 |9706,14801,13354,... |a |
+------+-------------+----------------------+-----+
|67 |2051 |8103,16366,8795,... |b |
+------+-------------+----------------------+-----+
|133 |2051 |8795,8070,15341,... |c |
+------+-------------+----------------------+-----+
|22 |1234 |4782,283,33,... |a |
+------+-------------+----------------------+-----+
...
Table Grades
|ID |RecommendationID |RecommendedDocumentID |Grade |EvaluatorHash|
+------+-----------------+----------------------+------+-------------+
|1 |1 |9706 |4 |123456789 |
+------+-----------------+----------------------+------+-------------+
|2 |1 |14801 |5 |123456789 |
+------+-----------------+----------------------+------+-------------+
|3 |1 |13354 |3 |987654321 |
+------+-----------------+----------------------+------+-------------+
|3 |1 |9706 |3 |987654321 |
+------+-----------------+----------------------+------+-------------+
|4 |67 |8103 |5 |123456789 |
+------+-----------------+----------------------+------+-------------+
|1 |67 |16366 |4 |987654321 |
+------+-----------------+----------------------+------+-------------+
|1 |133 |8795 |2 |123456789 |
+------+-----------------+----------------------+------+-------------+
...
我已将表 Recommendations 中的 RecommendedContentIDs 列转换为一个单独的表,如下所示:
Table RecommendedContent
|ID |RecommendationID |RecommendedContentID |Rank |
+------+-----------------+---------------------+-----+
|1 |1 |9706 |1 |
+------+-----------------+---------------------+-----+
|2 |1 |14801 |2 |
+------+-----------------+---------------------+-----+
|3 |1 |13354 |3 |
+------+-----------------+---------------------+-----+
|4 |1 |12787 |4 |
+------+-----------------+---------------------+-----+
...
+------+-----------------+---------------------+-----+
|11 |2 |19042 |1 |
+------+-----------------+---------------------+-----+
|12 |2 |13376 |2 |
+------+-----------------+---------------------+-----+
|13 |2 |9853 |3 |
+------+-----------------+---------------------+-----+
预期结果
我现在想进行一个查询,该查询将返回一个结果集,该结果集包含两个对应的逗号分隔列表,以便我能够显示每个推荐内容 ID 的平均成绩。它应该看起来像这样:
|ContentID |RecommendedContentIDs |RecommendedContentAverageGrades |Type |
+-------------+-------------------------+----------------------------------+------+
|2051 |9706,14801,13354,... |3.5,5.0,3.0,... |a |
+-------------+-------------------------+----------------------------------+------+
|2051 |8103,16366,8795,... |5.0,4.0,0.0,... |b |
+-------------+-------------------------+----------------------------------+------+
|2051 |8795,8070,15341,... |2.0,0.0,0.0,... |c |
+-------------+-------------------------+----------------------------------+------+
...
如您所见,该RecommendedContentAverageGrades
列包含该列中每个对应 ContentID的平均RecommendedContentIDs
评分(ID 为 9706 的内容被评分了两次,一次为 4,一次为 3,因此平均值为 3.5)。如果内容没有被评分,平均评分应该是0。这里真正重要的是两个逗号分隔的列表是对应的,因为列表中的列表RecommendedContentIDs
是排名列表。
我通常会在 C# 中实现类似的东西,但我想知道它是否可以用 SQL 来完成。我正在考虑使用GROUP_CONCAT
,但我无法获得正确的结果集。如果有人能为 MySQL 和/或 T-SQL 提供一个有效的 SQL 查询,我将非常感激,但只是建议也可以。
编辑
#1 - Laurence 提到使用单独的表格而不是逗号分隔的列表。由于旧设计,我正在使用它们,我无法更改。但是,我愿意接受假设逗号分隔列表中的数据存储在单独表中的答案。
#2 - 像 Laurence 建议的那样改变结构(使用分隔表 - 请参阅更新的结构)。