0

ユーザーがアイテムを推奨できるニュース システムがあります。しかし、誰かがアイテムを表示しているときに、そのアイテムが表示されていることを推奨した人が推奨した他のアイテムのリストを表示したいと考えています。「この商品をすすめたユーザーもすすめた…」みたいな。

レコメンデーション テーブル

  +----+------+---------+
  | id | user |   item  |
  +----+------+---------+
  | 1  |   1  |    1    | User 1 recommended item 1
  +----+------+---------+
  | 2  |   1  |    2    |
  +----+------+---------+
  | 3  |   2  |    2    |
  +----+------+---------+
  | 4  |   3  |    3    |
  +----+------+---------+
  | 5  |   2  |    3    |
  +----+------+---------+

品目表

  +----+---------+---------+
  | id |  title  | author  |
  +----+---------+---------+
  | 1  |Hello... |    me   |
  +----+---------+---------+
  | 2  | Bye...  |   you   |
  +----+---------+---------+
  | 3  |  Hi...  |    me   |
  +----+---------+---------+

ID 1 のユーザーが示すように、推奨アイテム 1 と 2、およびユーザー 2 も推奨アイテム 2、推奨アイテム 3 も表示されます。したがって、誰かがアイテム 2 を見ているときは、アイテム 3 がリストに表示されるはずです。アイテム 3 を見ている場合、アイテム 2 のリストが表示されます。

SQL クエリの実行方法がわかりません。最初に、閲覧中の記事を推奨したすべてのユーザーの ID を取得し、その後、選択したユーザー ID の中で最も繰り返し使用されているアイテムの ID を確認する必要があると思います。

そして、それらのアイテムの ID を使用して、アイテムのタイトルまたは著者情報を取得します。

しかし、より最適化された方法で SQL クエリを作成する方法がわかりません。どうぞよろしくお願いいたします。

4

2 に答える 2

2

問題を 2 つのタスクに分割しました。

1.現在のユーザーを除く、このアイテムを推奨したすべてのユーザーを選択します。

SELECT
    recommendations.user
FROM
    recommendations
WHERE
    recommendations.item=$item_id
AND
    recommendations.user!=$user_id

2.次に、このクエリをサブクエリとして使用して、現在表示されているアイテムを除く、それらのユーザーが推奨するすべてのアイテムを取得します。

SELECT
    items.id,
    items.title
FROM
    items
INNER JOIN
    recommendations
ON
    items.id=recommendations.item
WHERE
    recommendations.user IN
(
SELECT
    recommendations.user
FROM
    recommendations
WHERE
    recommendations.item=$item_id
AND
    recommendations.user!=$user_id
)
AND
    items.id!=$item_id
GROUP BY
    items.id

3. 最もおすすめのアイテムを最初に表示する場合は、そのアイテムをおすすめしたユーザーの数で結果を並べ替える必要があります。

SELECT
    items.id,
    items.title,
    COUNT(*) AS cnt
FROM
    items
INNER JOIN
    recommendations
ON
    items.id=recommendations.item
WHERE
    recommendations.user IN
(
SELECT
    recommendations.user
FROM
    recommendations
WHERE
    recommendations.item=$item_id
AND
    recommendations.user!=$user_id
)
AND
    items.id!=$item_id
GROUP BY
    items.id
ORDER BY
    cnt DESC
于 2013-06-08T21:41:30.443 に答える
0

結合を使用して目的を達成することはできますが、各アイテムと対応する推奨アイテムを 1 対 1 で関連付ける 3 つ目のテーブルを作成することをお勧めします。

このようにして、推奨アイテムの Mysql クエリは、ソース アイテムのこの 3 番目のテーブルをクエリし、すべての推奨アイテムの結果セットを返すことで、はるかに効率的になります。

次に、レコメンデーション テーブルに対して簡単なクエリを実行して、問題のアイテムをレコメンデーションした人の ID を取得することもできます。

アイテムの数が少ない場合、これはやり過ぎに思えるかもしれませんが、数が多くなると、必要な Mysql 処理で最適化が重要になる可能性があります。

于 2013-06-08T21:48:00.777 に答える