我正在尝试检查用户是否可以在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。关于如何做得更好或者我的句子中的错误有什么帮助?
我的目标是返回一个结果,然后授予访问权限。如果查询结果为空集,则拒绝访问。
感谢。
答案 0 :(得分: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
答案 1 :(得分: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
条款仅在documents
和users
之间;由于permissions
未加入,因此您无法在p.docId
子句中引用ON
。
您还错过了users
和permissions
之间的加入条件,因此您可以获得所有人的权限,而不仅仅是user1的权限。
只检查单个表而不是表之间的关系的条件应该在WHERE
子句而不是ON
中(例外:OUTER JOIN
有时需要限制到子集正在加入的表,这应该在ON
子句中完成。