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所有原始用户喜欢的项目

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. 目前,我必须执行 5 次“选择 50 人”查询并从中选择前 50 人
  2. 然后我必须执行“选择 5 个项目”查询 50 *(初始用户喜欢的项目数)

执行查询后,我打算将查询结果存储在 cookie 中(如果用户同意我使用 cookie,否则他们根本不会得到“项目建议”),键是查询,这意味着它每天/每周只会触发一次(这就是为什么我返回 5 个建议并随机选择一个键来显示)

基本上,如果有人知道如何将这些查询写成一个查询,你能告诉我并解释查询中发生了什么吗?

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 回答