我有一个新闻系统,用户可以在其中推荐项目。但现在,我希望当有人查看某个项目时,显示一个列表,其中列出了推荐该项目的人所推荐的其他项目。类似于“推荐此项目的用户也推荐了...”
推荐表
+----+------+---------+
| 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查询。我将感谢你的支持。
发布于 2013-06-09 05:41:30
我把你的问题分成两个任务:
1.选择推荐该项目的所有用户,当前用户除外:
SELECT
recommendations.user
FROM
recommendations
WHERE
recommendations.item=$item_id
AND
recommendations.user!=$user_id2.然后,我们使用此查询作为子查询,以获取这些用户推荐的所有项目,但不包括当前查看的项目:
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.id3.如果您想首先显示最受推荐的项目,则需要根据推荐该项目的用户数量对结果进行排序:
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-09 05:48:01
当然,您可以使用Joins来实现您的目标,但使用第三个表可能是一个更好的主意,该表为每个项目和相应的推荐项目提供一对一的关系。
这样,您的Mysql查询推荐项目的效率将会更高,查询第三个表中的源项目并返回所有推荐项目的结果集。
然后,您还可以对recommendations表执行一个简单的查询,以获得推荐相关项目的人员的in。
对于数量较少的项目,这似乎有点过头了,但是当您接近较大数量时,所需的Mysql处理方面的优化可能非常重要。
https://stackoverflow.com/questions/17004008
复制相似问题