postgresql查询以确定用户未看到的推荐记录
我有3个表:user、推荐post\u id、user\u id、post 当用户对帖子进行投票时,将使用帖子id、用户id和投票值创建新的推荐记录 我想有一个查询,显示一个用户尚未看到/投票的随机帖子 我的想法是,它需要将用户的所有推荐加入到post表中。。。然后选择没有联合推荐的记录。但不知道该怎么做 到目前为止,我所拥有的肯定不起作用:postgresql查询以确定用户未看到的推荐记录,sql,postgresql,Sql,Postgresql,我有3个表:user、推荐post\u id、user\u id、post 当用户对帖子进行投票时,将使用帖子id、用户id和投票值创建新的推荐记录 我想有一个查询,显示一个用户尚未看到/投票的随机帖子 我的想法是,它需要将用户的所有推荐加入到post表中。。。然后选择没有联合推荐的记录。但不知道该怎么做 到目前为止,我所拥有的肯定不起作用: SELECT "posts".* FROM "posts" INNER JOIN "recommendations" ON "recommendatio
SELECT "posts".*
FROM "posts"
INNER JOIN "recommendations" ON "recommendations"."post_id" = "posts"."id"
ORDER BY RANDOM()
LIMIT 1
可以使用左外部联接执行此操作:
SELECT p.*
FROM posts p LEFT OUTER JOIN
recommendations r
ON r.post_id = p.id and r.userid = YOURUSERID
WHERE r.post_id IS NULL
ORDER BY RANDOM()
LIMIT 1;
注意,我通过删除标识符名称不需要的双引号并添加表别名简化了查询。这些更改使查询更易于写入和读取。您可以使用左外部联接来执行此操作:
SELECT p.*
FROM posts p LEFT OUTER JOIN
recommendations r
ON r.post_id = p.id and r.userid = YOURUSERID
WHERE r.post_id IS NULL
ORDER BY RANDOM()
LIMIT 1;
注意,我通过删除标识符名称不需要的双引号并添加表别名简化了查询。这些更改使查询更易于写入和读取。您可以使用左外部联接来执行此操作:
SELECT p.*
FROM posts p LEFT OUTER JOIN
recommendations r
ON r.post_id = p.id and r.userid = YOURUSERID
WHERE r.post_id IS NULL
ORDER BY RANDOM()
LIMIT 1;
注意,我通过删除标识符名称不需要的双引号并添加表别名简化了查询。这些更改使查询更易于写入和读取。您可以使用左外部联接来执行此操作:
SELECT p.*
FROM posts p LEFT OUTER JOIN
recommendations r
ON r.post_id = p.id and r.userid = YOURUSERID
WHERE r.post_id IS NULL
ORDER BY RANDOM()
LIMIT 1;
注意,我通过删除标识符名称不需要的双引号并添加表别名简化了查询。这些更改使查询更易于编写和阅读。因此您需要一组已推荐的所有帖子
SELECT p.id FROM posts p
EXCEPT
SELECT r.post_id FROM recommendations r WHERE r.user_id = X
...
所以你需要一组已经推荐的帖子
SELECT p.id FROM posts p
EXCEPT
SELECT r.post_id FROM recommendations r WHERE r.user_id = X
...
所以你需要一组已经推荐的帖子
SELECT p.id FROM posts p
EXCEPT
SELECT r.post_id FROM recommendations r WHERE r.user_id = X
...
所以你需要一组已经推荐的帖子
SELECT p.id FROM posts p
EXCEPT
SELECT r.post_id FROM recommendations r WHERE r.user_id = X
...
有几种很好的方法可以排除已经有来自给定用户的建议的行: 重要的问题是:武断还是随机? 对于任意拾取,任何符合条件的行都足够好,这应该是最便宜的:
SELECT *
FROM posts p
WHERE NOT EXISTS (
SELECT 1
FROM recommendations
WHERE post_id = p.id
AND user_id = $my_user_id
)
LIMIT 1;
排序步骤可能很昂贵,而且对于很多帖子来说都是不必要的。在这样的用例中,大多数帖子通常还没有用户的推荐。你每次都得把这些行按随机顺序排列。
如果任何没有推荐的帖子都足够好的话,删除订单将使其速度大大加快。Postgres只需返回它找到的第一个符合条件的帖子。有几种很好的方法可以排除已经有给定用户推荐的行: 重要的问题是:武断还是随机? 对于任意拾取,任何符合条件的行都足够好,这应该是最便宜的:
SELECT *
FROM posts p
WHERE NOT EXISTS (
SELECT 1
FROM recommendations
WHERE post_id = p.id
AND user_id = $my_user_id
)
LIMIT 1;
排序步骤可能很昂贵,而且对于很多帖子来说都是不必要的。在这样的用例中,大多数帖子通常还没有用户的推荐。你每次都得把这些行按随机顺序排列。
如果任何没有推荐的帖子都足够好的话,删除订单将使其速度大大加快。Postgres只需返回它找到的第一个符合条件的帖子。有几种很好的方法可以排除已经有给定用户推荐的行: 重要的问题是:武断还是随机? 对于任意拾取,任何符合条件的行都足够好,这应该是最便宜的:
SELECT *
FROM posts p
WHERE NOT EXISTS (
SELECT 1
FROM recommendations
WHERE post_id = p.id
AND user_id = $my_user_id
)
LIMIT 1;
排序步骤可能很昂贵,而且对于很多帖子来说都是不必要的。在这样的用例中,大多数帖子通常还没有用户的推荐。你每次都得把这些行按随机顺序排列。
如果任何没有推荐的帖子都足够好的话,删除订单将使其速度大大加快。Postgres只需返回它找到的第一个符合条件的帖子。有几种很好的方法可以排除已经有给定用户推荐的行: 重要的问题是:武断还是随机? 对于任意拾取,任何符合条件的行都足够好,这应该是最便宜的:
SELECT *
FROM posts p
WHERE NOT EXISTS (
SELECT 1
FROM recommendations
WHERE post_id = p.id
AND user_id = $my_user_id
)
LIMIT 1;
排序步骤可能很昂贵,而且对于很多帖子来说都是不必要的。在这样的用例中,大多数帖子通常还没有用户的推荐。你每次都得把这些行按随机顺序排列。
如果任何没有推荐的帖子都足够好的话,删除订单将使其速度大大加快。Postgres可以返回找到的第一个符合条件的帖子。你需要真正的随机性,还是任意性足够好?你需要真正的随机性,还是任意性足够好?你需要真正的随机性,还是任意性足够好?你需要真正的随机性,还是任意性足够好?