1

SQL の 1 つのコマンドで、ユーザーが 1 つのドキュメントにアクセスできるかどうかを確認しようとしています。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 は以前に宣言されています。どうすればもっとうまくできるか、または私の文のエラーは何ですか?

私の目的は、1 つの結果が返され、アクセスが許可されることです。クエリ結果が空のセットの場合、アクセスは拒否されます。

ありがとう。

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節がdocumentsとの間だけだったからusersです。結合されていないため、句でpermissions参照できません。p.docIdON

usersとの間の結合条件も欠落していたpermissionsため、user1 のアクセス許可だけでなく、全員のアクセス許可を取得していたでしょう。

テーブル間の関係ではなく、単一のテーブルのみをチェックする条件は、 (例外:結合されるテーブルのサブセットに制限する必要がある場合があり、これは句で行う必要があります)WHEREではなく、句に含める必要があります。ONOUTER JOINON

于 2013-09-25T19:25:35.587 に答える