0

我有一个包含用户的 PostgreSQL 表,一个包含文档的 PostgreSQL 表,以及一个将用户映射到他们已阅读的文档的表。像这样:

表:用户

------------
| oid      |
| username |
| ...      |
------------

表:文件

------------
| oid      |
| title    |
| ...      |
------------

表:users_documents

-----------------
| oid           |
| user_oid      |
| document_oid  |
-----------------

每当用户阅读文档时,都会向 users_documents 添加一条记录,其中包含他们的用户 ID 和文档 ID。这一切都很好。

我想做的是为给定用户选择一个随机的未读文档。我觉得我应该能够通过一个相当简单的 JOIN 来做到这一点,但我无法完全理解查询应该是什么样子。

有人可以帮忙吗?谢谢。

4

1 回答 1

1

对于大多数数据,您可以转到 users_documents 表。例如,查询 user_oid = 读取的文档?将会

SELECT document_oid
FROM users_documents
WHERE user_oid = ?

但是,您想要丢失的记录。

您可以进行外部联接,并在结果中找到 NULL。

SELECT users_documents.document_oid
FROM users_documents
  RIGHT OUTER JOIN documents
    ON users_documents.document_oid = documents.oid AND users_documents.user_oid = ?

重要的是“users_documents.user_oid =?” 在 FROM 子句中而不是在 WHERE 子句中的连接中,因为它在 WHERE 子句中不起作用。

于 2013-01-07T16:59:56.250 回答