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

我将您的问题分为两个任务:

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

您当然可以使用 Joins 来实现您的目标,但最好有第三个表,其中每个项目和相应的推荐项目都具有一对一的关系。

这样,您对推荐项目的 Mysql 查询将更有效地查询第三个表以获取源项目并返回所有推荐项目的结果集。

然后,您还可以对推荐表进行简单查询,以获取推荐相关项目的人员的 ID。

对于少量项目,这似乎有点过头了,但是当您处理大量项目时,优化在所需的 Mysql 处理中可能很重要。

于 2013-06-08T21:48:00.777 回答