在PostgreSQL中选择未读文件(JOINS?)

时间:2013-01-07 16:36:43

标签: sql postgresql

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

表:用户

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

表:文件

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

表:users_documents

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

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

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

有人可以帮忙吗?感谢。

1 个答案:

答案 0 :(得分: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子句中不起作用。