1

私はWebアプリケーションを開発していて、(とりわけ)2つのモデル(ユーザーと多対多の関連付けを持つアイテム)があります。したがって、主キー「id」と外部キーuser_idおよびitem_idを持つテーブル「users」、「items」、および「items_users」があります。

私が持っているのは「自動提案」機能です。たとえば、私がユーザーとして特定のアイテムを良いとマークした場合、システムは、おそらく私も良いとマークしたn個のアイテムを提案することになっています。自動提案の妥当な基準は、最初のアイテムを別のアイテムのように気に入ったユーザーの数です。お茶が好きなすべてのユーザーがティーポットも好きなら、ティーポットは自動提案のトップの位置にあります。

これは基本的な機能です。一部の結果もフィルタリングしますが、残りは関係ありません。オンデマンドで高速に計算したり、n個の提案を計算するための別のプロセスをスケジュールしたりするためのある種の補助テーブルについて考えています。

関連情報ありがとうございます!

UPD

質問は不明瞭に聞こえた。私はsqldbとsinatraと続編のormを持っています。最も類似したアイテムのデータセットを計算する方法について質問しています(最も安価で、リソースを最も消費しないアプローチ)。どのように実装しますか?

4

2 に答える 2

0

リンクテーブルを使用して、ユーザーとアイテムを結合します。WHERE-Clauseに次のフィルターを適用します。-
アイテムを高く評価した(「良いとマークした」)
-現在のユーザーがまだ良いとマークしていないアイテム

いいねの数で降順​​に並べ替えます(アイテムIDでグループ化し、ユーザーを数える必要があります)。

于 2012-10-17T15:01:41.187 に答える
0

したがって、一般的には、同じ製品を気に入ったすべてのユーザーを選択し、各製品のいいねの数を数えて、気に入った製品を取得し、最も気に入った製品を出力する必要があります。

では、これはSQLでどのように見えるでしょうか?

これがSQLでどのように見えるか見てみましょう。

ステップ1:お気に入りのIDを取得する

SELECT it.item_id FROM `item_users` it WHERE it.user_id = %current_user%

ステップ2:同じアイテムが好きなユーザーを獲得する

SELECT u.id FROM `item_users` it, `users` u WHERE it.item_id IN (  
    SELECT it.item_id FROM `item_users` it WHERE it.user_id = %current_user%  
) AND it.user_id != %current_user% AND u.id = it.user_id GROUP BY it.user_id

ステップ3:お気に入りを取得する

また、SQLクエリ全体は次のようになります。

SELECT i.* FROM `items` i, `item_users` it WHERE it.user_id IN (  
    SELECT u.id FROM `item_users` it, `users` u WHERE it.item_id IN (  
        SELECT it.item_id FROM `item_users` it WHERE it.user_id = %current_user%  
    ) AND it.user_id != %current_user% AND u.id = it.user_id GROUP BY it.user_id  
) AND i.id = it.item_id GROUP BY i.id ORDER BY count(*) DESC

あなたの仕事は結果の制限を追加することです...

更新:私はあなたが最初に最も人気のある製品を手に入れたいと思うと思います。その機能を追加するようにクエリを変更しました(ORDER BY count(*) DESC最後に追加)

これは複雑なクエリであり、ActiveRecordを使用して実装すると非常に遅く、さらに複雑になるため、クエリをそのまま使用することをお勧めします。

于 2012-10-17T16:02:17.550 に答える