我有一个新闻系统,用户可以推荐该项目。但是现在我希望当有人正在查看某个项目时,显示推荐该项目被查看的人推荐的其他项目的列表。类似“推荐这个项目的用户也推荐......”
建议表
+----+------+---------+
| 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查询。我很感激你的支持。
答案 0 :(得分: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
答案 1 :(得分:0)
你当然可以使用Joins来实现你的目标,但是为每个项目和相应的推荐项目建立一个具有一对一关系的第三个表可能更好。
这样,对推荐项目的Mysql查询将更有效地查询源项目的第三个表并返回所有推荐项目的结果集。
然后,您还可以对推荐表进行简单查询,以获取推荐相关项目的人员的ID。
对于少量项目,这看起来似乎有点过分,但是当您接近大数字时,优化在所需的Mysql处理中可能很重要。