0

我有两张桌子

表一是文件清单

文件:

+-------------+---------------+
| document_ID | document_name |
+-------------+---------------+
|    1        |   test.pdf    |
+-------------+---------------+
|    2        |  other.pdf    |
+-------------+---------------+

表二是使用过该文档的用户列表。这是一个 1-1 的关系 - 即用户只会使用一次文档(或根本不使用)。

文档用户:

+-------------+---------------+-----------+---------------+
| document_ID | user_ID       | has_read  | (other stuff) |
+-------------+---------------+-----------+---------------+
|    1        |   5           |     1     |      stuff    |
+-------------+---------------+-----------+---------------+
|    1        |   7           |     1     |      stuff    |
+-------------+---------------+-----------+---------------+
|    2        |   5           |     1     |      stuff    |
+-------------+---------------+-----------+---------------+

当用户浏览列表时 - 我需要能够显示所有文档,以及他们是否可以访问它

因此,例如,上面示例中用户 5 的期望输出是;

+-------------+---------------+-----------+---------------+
| document_ID | document_name |  has_read | (other stuff) |
+-------------+---------------+-----------+---------------+
|    1        |   test.pdf    |     1     |      stuff    |
+-------------+---------------+-----------+---------------+
|    2        |  other.pdf    |     1     |      stuff    |
+-------------+---------------+-----------+---------------+

而用户 7 的期望输出是

+-------------+---------------+-----------+---------------+
| document_ID | document_name |  has_read | (other stuff) |
+-------------+---------------+-----------+---------------+
|    1        |   test.pdf    |     1     |   stuff       |
+-------------+---------------+-----------+---------------+
|    2        |  other.pdf    |           |               |
+-------------+---------------+-----------+---------------+

我尝试按照以下方式进行连接

$this->db->join('documents_users', 'documents_users.document_ID = documents.document_ID');
$this->db->where('documents_users.user_ID', '7');
return $this->get_all();

但这只会返回他们 has_read=1 的记录

我可以看到问题出在“where”命令上——但我不知道该怎么办?

4

2 回答 2

1

您需要一个(左)外部联接,将过滤条件user_ID移动到联接条件而不是在WHERE子句中:

$this->db->join(
   'documents_users',
   'documents_users.document_ID = documents.document_ID
AND documents_users.user_ID = 7',
   'left'
);
于 2012-08-29T13:26:59.783 回答
0

你需要采取STRAIGHT_JOIN

SELECT a.document_ID, a.document_name, b.has_read,
FROM documents a 
     STRAIGHT_JOIN documents_users b
WHERE b.user_ID = 7;
于 2012-08-29T13:07:47.650 回答