复杂的MySQL查询需要帮助 - 范围非常狭窄

时间:2014-11-11 18:32:40

标签: mysql jdbc

以下是我所描述的表格及其内容:
用户:

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| public_key_path | varchar(100) | NO   |     | NULL    |                |
| email           | varchar(50)  | NO   |     | NULL    |                |
| pbox            | varchar(50)  | YES  | UNI | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

内容:

+----+-------------------+----------------------+--------+
| id | public_key_path   | email                | pbox   |
+----+-------------------+----------------------+--------+
| 33 | /path/to/pubkey1/ | FirstUser@email.com  | Pbox01 |
| 34 | /path/to/pubkey2/ | SecondUser@email.com | Pbox02 |
| 35 | /path/to/pubkey3/ | ThirdUser@email.com  | Pbox03 |
+----+-------------------+----------------------+--------+

文件:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| file_path | varchar(100) | NO   | UNI | NULL    |                |
| owner_id  | int(11)      | NO   | MUL | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

内容:

+-----+-----------------+----------+
| id  | file_path       | owner_id |
+-----+-----------------+----------+
| 104 | /path/to/file1/ |       33 |
| 105 | /path/to/file2/ |       34 |
| 106 | /path/to/file3/ |       35 |
| 107 | /path/to/file4/ |       33 |
| 108 | /path/to/file5/ |       33 |
| 109 | /path/to/file6/ |       34 |
+-----+-----------------+----------+

encrypted_symmetric_keys:

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| key_path | varchar(100) | YES  | UNI | NULL    |                |
| file_id  | int(11)      | NO   | MUL | NULL    |                |
| user_id  | int(11)      | NO   | MUL | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

内容:

+-----+---------------------+---------+---------+
| id  | key_path            | file_id | user_id |
+-----+---------------------+---------+---------+
| 106 | /path/to/key1forU1/ |     104 |      33 |
| 107 | /path/to/key2forU2/ |     105 |      34 |
| 108 | /path/to/key3forU3/ |     106 |      35 |
| 109 | /path/to/key4forU1/ |     107 |      33 |
| 110 | /path/to/key5forU1/ |     108 |      33 |
| 111 | /path/to/key6forU2/ |     109 |      34 |
| 112 | /path/to/key3forU1/ |     106 |      33 |
| 113 | /path/to/key2forU1/ |     105 |      33 |
| 114 | /path/to/key6forU1/ |     109 |      33 |
+-----+---------------------+---------+---------+

这是一个服务器的新手数据库,用于存储使用加密对称密钥(ESK)加密的文件路径。
如果有key_path /path/to/key1forU1/,则意味着为user1存储了file1的密钥 我需要一个查询,当给定file_path(例如“/ path / to / file1 /”)时,列出所有有权访问该文件的用户。
如果您需要更多信息,请告诉我,我会立即提供 我知道这是一个非常本地化的问题,但我现在已经考虑了一个多小时了,而且围绕着我的头部我遇到了可怕的问题。

非常感谢你。

编辑:

我需要的最后一组数据是,给出时  '/路径/到/ file1的/'
 会回来的 FirstUser@email.com

但是举个例子时给出了 /路径/到/ file2的/” 会回来的 FirstUser@email.com
SecondUser@email.com
因为

1 个答案:

答案 0 :(得分:0)

我认为这就是你要找的东西 因为这将为您提供使用file_path = '/path/to/file6/'的所有电子邮件,但所有者的电子邮件除外

SELECT su.email
FROM encrypted_symmetric_keys AS c 
INNER JOIN users AS su ON su.id = c.user_id
INNER JOIN files AS f ON f.id = c.file_id AND f.owner_id <> c.user_id
WHERE f.file_path = '/path/to/file6/'