問題の説明
各推奨事項の平均成績のコンマ区切りリストを取得しようとしています。これは、推奨コンテンツIDの別のコンマ区切りリストで構成されています。レコメンデーションは、レコメンデーションを受け取るコンテンツ(ContentID
)と、レコメンデーションされるその他のコンテンツのリスト()で構成されるオブジェクトRecommendedContentIDs
です。
テーブル構造、サンプルデータ、その他の制限
私は2つのテーブルのデータベース構造を持っています。最初の表には、コンマ区切りのランク付けされたリストとして保存された推奨コンテンツIDが含まれています。2番目の表には、推奨される各コンテンツ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 |
+------+-----------------+---------------------+-----+
期待される結果
次に、対応する2つのコンマ区切りリストを含む結果セットを返すクエリを作成して、推奨される各コンテンツ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 |
+-------------+-------------------------+----------------------------------+------+
...
ご覧のとおり、この列には、対応する各ContentIDの平均RecommendedContentAverageGrades
評点が列に含まれています(ID 9706のコンテンツは2回評定され、1回は4、もう1回は3であるため、平均は3.5です)。コンテンツが採点されていない場合、平均評点は0になります。ここで非常に重要なのは、のリストがランク付けされたリストであるため、 2つのコンマ区切りリストが対応していることです。RecommendedContentIDs
RecommendedContentIDs
私は通常、このようなものをC#で実装しますが、SQLで実行できるかどうか疑問に思っていました。使用することを考えてGROUP_CONCAT
いましたが、適切な結果セットを得ることができませんでした。誰かがMySQLやT-SQL用の実用的なSQLクエリを提供してくれれば非常にありがたいですが、提案だけでも問題ありません。
編集
#1-ローレンスは、コンマ区切りのリストの代わりに個別のテーブルを使用することに言及しました。古いデザインのため使用していますが、変更することはできません。ただし、コンマ区切りのリストのデータは別のテーブルに格納されていると想定している場合は、自由に回答できます。
#2-ローレンスが提案したように構造を変更しました(分離されたテーブルを使用-更新された構造を参照)。