首页 > 解决方案 > MySQL 查询多对多关系中的表

问题描述

我在创建 SQL 查询时遇到问题。我准备了 3 个记录很少的表:

tbl_documents

+-------------+------------------+
| document_id | document_type_id |
+-------------+------------------+
|        0001 | PRE              |
|        0002 | PRE              |
|        0003 | PRE              |
+-------------+------------------+

tbl_users

+---------+------------------+
| user_id |    user_name     |
+---------+------------------+
| Jara-PC | Jara S           |
| User1   | Uživatel 1       |
| User2   | Uživatel 2       |
+---------+------------------+

每个文档可以有多个批准者(用户),每个用户可以是多个文档的批准者,所以我使用表 tbl_approvers 创建了多对多关系

tbl_approvers

+-------------+-------------+------------------+
| approver_id | document_id | document_type_id |
+-------------+-------------+------------------+
| Jara-PC     |        0001 | PRE              |
| Jara-PC     |        0003 | PRE              |
+-------------+-------------+------------------+

我在使用此结果创建查询时遇到问题- 对于每个文档列表,都有一个不是批准者的用户,如下所示:

+------------------+-------------+--------------+
| document_type_id | document_id | not_approver |
+------------------+-------------+--------------+
| PRE              |           1 | User1        |
| PRE              |           1 | User2        |
| PRE              |           2 | Jara-PC      |
| PRE              |           2 | User1        |
| PRE              |           2 | User2        |
| PRE              |           3 | User1        |
| PRE              |           3 | User2        |
+------------------+-------------+--------------+

我创建了查询,它将返回每个文档的批准者:

SELECT *
FROM (
    SELECT tdoc.document_type_id,
           tdoc.document_id,
           ta.approver_id
    FROM tbl_documents tdoc
    LEFT JOIN tbl_approvers ta
        ON tdoc.document_id = ta.document_id AND
           tdoc.document_type_id = ta.document_type_id) tc;

结果:

+------------------+-------------+----------+
| document_type_id | document_id | approver |
+------------------+-------------+----------+
| PRE              |        0001 | Jara-PC  |
| PRE              |        0002 | null     |
| PRE              |        0003 | Jara-PC  |
+------------------+-------------+----------+

现在我被卡住了,我可以查询是否有用户不批准任何文件,但这不是我想要的。甚至可以在 SQL 中完成吗?

标签: sqlmany-to-many

解决方案


这是你想要的吗?

    Select u.userid as "Not Approver" ,  
    d.* from
     tbl_users u left join
    tbl_approvers a on
     u.userid <a.approver_id
     right join
     tbl_documents d
      On 
     a.document_id =d.document_id 
     and a.document_type_id  = d. 
      document_type_id

推荐阅读