首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL显示推荐项目

MySQL显示推荐项目
EN

Stack Overflow用户
提问于 2013-06-09 05:26:20
回答 2查看 930关注 0票数 0

我有一个新闻系统,用户可以在其中推荐项目。但现在,我希望当有人查看某个项目时,显示一个列表,其中列出了推荐该项目的人所推荐的其他项目。类似于“推荐此项目的用户也推荐了...”

推荐表

代码语言:javascript
复制
  +----+------+---------+
  | id | user |   item  |
  +----+------+---------+
  | 1  |   1  |    1    | User 1 recommended item 1
  +----+------+---------+
  | 2  |   1  |    2    |
  +----+------+---------+
  | 3  |   2  |    2    |
  +----+------+---------+
  | 4  |   3  |    3    |
  +----+------+---------+
  | 5  |   2  |    3    |
  +----+------+---------+

项目表

代码语言:javascript
复制
  +----+---------+---------+
  | 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查询。我将感谢你的支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-09 05:41:30

我把你的问题分成两个任务:

1.选择推荐该项目的所有用户,当前用户除外:

代码语言:javascript
复制
SELECT
    recommendations.user
FROM
    recommendations
WHERE
    recommendations.item=$item_id
AND
    recommendations.user!=$user_id

2.然后,我们使用此查询作为子查询,以获取这些用户推荐的所有项目,但不包括当前查看的项目:

代码语言:javascript
复制
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.如果您想首先显示最受推荐的项目,则需要根据推荐该项目的用户数量对结果进行排序:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-06-09 05:48:01

当然,您可以使用Joins来实现您的目标,但使用第三个表可能是一个更好的主意,该表为每个项目和相应的推荐项目提供一对一的关系。

这样,您的Mysql查询推荐项目的效率将会更高,查询第三个表中的源项目并返回所有推荐项目的结果集。

然后,您还可以对recommendations表执行一个简单的查询,以获得推荐相关项目的人员的in。

对于数量较少的项目,这似乎有点过头了,但是当您接近较大数量时,所需的Mysql处理方面的优化可能非常重要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17004008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档