1

ユーザーがすでに関心を示しているアイテムに基づいてアイテムを提案するために実行する必要がある 4 つのクエリがあります。

ユーザーがすでに気に入っているアイテムをランダムに 5 つ選択します

SELECT item_id
FROM user_items
WHERE user_id = :user_person
ORDER BY RAND()
LIMIT 5

同じアイテムが好きな人を50人選ぶ

SELECT user_id 
FROM user_items
WHERE user_id != :user_person
AND item_id = :selected_item_list
LIMIT 50

元のユーザーが好きなすべてのアイテムを選択します

SELECT item_id
FROM user_items
WHERE user_id = :user_person

ユーザーがまだユーザーに提案したくないアイテムを 5 つ選択します

SELECT item_id
FROM user_items
WHERE user_id = :user_id_list
AND item_id != :item_id_list
LIMIT 5

私が知りたいのは、これを 1 つのクエリとして実行する方法です。

私がこれをやりたい理由はいくつかあります:

  1. 現時点では、「select 50 people」クエリを 5 回実行し、上位 50 人を選択する必要があります。
  2. 次に、「select 5 items」クエリ 50 * (最初のユーザーが気に入ったアイテムの数) を実行する必要があります。

クエリが実行されたら、クエリ結果を Cookie に保存するつもりです (ユーザーが Cookie の使用に同意した場合、そうでない場合は「アイテムの提案」をまったく取得しません)。つまり、1 日に 1 回、または 1 週間に 1 回だけ起動します (そのため、5 つの提案を返し、表示するキーをランダムに選択します)

基本的に、これらのクエリを 1 つのクエリとして記述する方法を知っている人がいたら、クエリで何が起こっているのかを説明してもらえますか?

4

1 に答える 1

2

これにより、必要なすべてのアイテムが選択されます。

SELECT DISTINCT ui_items.item_id
FROM user_items AS ui_own
JOIN user_items AS ui_others ON ui_own.item_id = ui_others.item_id
JOIN user_items AS ui_items ON ui_others.user_id = ui_items.user_id
WHERE ui_own.user_id = :user_person 
  AND ui_others.user_id <> :user_person
  AND ui_items.item_id <> ui_own.item_id

(結果がバージョンとまったく同じかどうかを確認してください-非常に小さな偽のデータセットでテストしました)

次に、このリストをキャッシュして、5 つの項目をランダムに表示します。非常ORDER BY RAND()に非効率的です (非決定論的クエリ => キャッシュなし)。

編集:DISTINCT重複行を表示しないように追加しました。

DISTINCT次のコードを削除してクエリの最後に追加することで、最も人気のある提案を人気の降順で返すこともできます。

GROUP BY ui_items.item_id
ORDER BY COUNT(*) DESC
LIMIT 20

最も人気のある 20 のアイテムを返すクエリの最後まで。

于 2012-06-10T11:08:18.630 に答える