postgresql查询以确定用户未看到的推荐记录

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

我有3个表:user、推荐post\u id、user\u id、post

当用户对帖子进行投票时,将使用帖子id、用户id和投票值创建新的推荐记录

我想有一个查询,显示一个用户尚未看到/投票的随机帖子

我的想法是,它需要将用户的所有推荐加入到post表中。。。然后选择没有联合推荐的记录。但不知道该怎么做

到目前为止,我所拥有的肯定不起作用:

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可以返回找到的第一个符合条件的帖子。

你需要真正的随机性,还是任意性足够好?你需要真正的随机性,还是任意性足够好?你需要真正的随机性,还是任意性足够好?你需要真正的随机性,还是任意性足够好?