1

我正在尝试在 SQL 中的一个命令中检查用户是否可以访问一个文档。我尽量避免在 checkAccess() 函数中放置太多 PHP。

我有一个用户名和一个文档 ID。

假设用户名是user1,文档 ID 是24

这些是我的表:

mysql> describe permissions;
+--------+----------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra          |
+--------+----------+------+-----+---------+----------------+
| id     | int(11)  | NO   | PRI | NULL    | auto_increment |
| wfId   | char(50) | NO   |     | NULL    |                |
| docId  | char(50) | NO   |     | NULL    |                |
| userId | int(11)  | NO   | MUL | NULL    |                |
+--------+----------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> describe users;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| login    | char(30) | NO   |     | NULL    |                |
| password | char(50) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> describe documents;
+---------+-----------+------+-----+---------+----------------+
| Field   | Type      | Null | Key | Default | Extra          |
+---------+-----------+------+-----+---------+----------------+
| id      | int(11)   | NO   | PRI | NULL    | auto_increment |
| name    | char(100) | YES  |     | NULL    |                |
| wfid    | char(50)  | YES  |     | NULL    |                |
| docid   | char(50)  | YES  |     | NULL    |                |
| created | datetime  | YES  |     | NULL    |                |
| updated | datetime  | YES  |     | NULL    |                |
+---------+-----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

这是我正在构建的查询:

mysql> select u.login, d.id, d.wfid, d.docid, p.wfId, p.docId, p.userId
from permissions p, documents d inner join users u
ON (u.login = "user1" AND d.id = 24 AND p.docId=d.docid AND p.wfId=d.wfid);
ERROR 1054 (42S22): Unknown column 'p.docId' in 'on clause'

但是 p.wfId 是先前声明的。关于我怎样才能做得更好或我的句子中有什么错误的任何帮助?

我的目标是返回一个结果,然后授予访问权限。如果查询结果为空集,则拒绝访问。

谢谢。

4

2 回答 2

1

试试这个:

select u.login, d.id, d.wfid, d.docid, p.wfId, p.docId, p.userId
from permissions p
inner join documents d on p.docId=d.docid AND p.wfId=d.wfid
inner join users u ON u.login = "user1" AND d.id = 24
于 2013-09-25T19:25:26.373 回答
1
SELECT u.login, d.id, d.wfid, d.docid, p.wfId, p.docId, p.userId
FROM permissions p
JOIN documents d ON p.docId = d.docid AND p.wdId = d.wdid
JOIN users u ON p.userId = u.id
WHERE u.login = "user1" and d.id = 24

您得到的错误是因为您的JOIN子句仅介于documentsand users; 因为permissions没有被加入,所以不能p.docIdON子句中引用。

您还缺少 and 之间的连接条件userspermissions因此您将获得每个人的权限,而不仅仅是 user1 的权限。

只检查单个表而不是表之间的关系的条件应该在WHERE子句中而不是ON(例外:OUTER JOIN有时需要限制到正在连接的表的子集,这应该在ON子句中完成)。

于 2013-09-25T19:25:35.587 回答