我有一个包含用户的PostgreSQL表,一个包含文档的PostgreSQL表,以及一个将用户映射到他们读过的文档的表。像这样:
表:用户
------------
| oid |
| username |
| ... |
------------
表:文件
------------
| oid |
| title |
| ... |
------------
表:users_documents
-----------------
| oid |
| user_oid |
| document_oid |
-----------------
每当用户阅读文档时,都会在users_documents中添加一条记录,其中包含用户ID和文档ID。这一切都很好。
我想要做的是为给定用户选择随机未读文档。我觉得我应该能够通过一个相当简单的JOIN来做到这一点,但是我无法理解查询应该是什么样子。
有人可以帮忙吗?感谢。
答案 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子句中不起作用。