2013-12-14 147 views
0

我已经搜索并浏览了类似于我的可用主题。但是,未能发现满足我的要求。因此,在这里发布。针对特定模式的多对多复杂MySQL查询

我有四个表如下:

"Organization" table: 
-------------------------------- 
| org_id  | org_name  | 
| 1   | A    | 
| 2   | B    | 
| 3   | C    | 

"Members" table: 
---------------------------------------------- 
| mem_id  | mem_name  | org_id  | 
| 1   | mem1   | 1   | 
| 2   | mem2   | 1   | 
| 3   | mem3   | 2   | 
| 4   | mem4   | 3   | 

"Resource" table: 
-------------------------------- 
| res_id  | res_name  | 
| 1   | resource1  | 
| 2   | resource2  | 
| 3   | resource3  | 
| 4   | resource4  | 

"member-resource" table: 
-------------------------------------------- 
| sl_no  | mem_id  | res_id  | 
| 1   | 1   | 1   | 
| 2   | 1   | 2   | 
| 3   | 2   | 1   | 
| 4   | 4   | 3   | 
| 5   | 3   | 4   | 
| 6   | 2   | 3   | 
| 7   | 4   | 3   | 

我想找出根据组织共享资源的总数。预期输出如下:

| org_name  | Shared Resources  | 
| A    | 1     | 
| B    | 0     | 
| C    | 1     | 

我也想根据组织找出重复资源的总数。预期输出如下:

| org_name  | Duplicate Resources | 
| A    | 2     | 
| B    | 0     | 
| C    | 1     | 

在这方面的任何帮助将高度赞赏。

问候。

+0

你能解释一下副本是如何在发布输出计算出来的? – peterm

回答

1

为了让整个组织共享资源的总数可以尝试

SELECT o.org_name, COALESCE(q.total, 0) shared_resources 
    FROM organization o LEFT JOIN 
(
    SELECT m.org_id, COUNT(DISTINCT mr.res_id) total 
    FROM member_resource mr JOIN members m 
     ON mr.mem_id = m.mem_id 
    WHERE EXISTS 
    (
    SELECT * 
     FROM member_resource mr2 JOIN members m2 
     ON mr2.mem_id = m2.mem_id 
    WHERE mr2.res_id = mr.res_id 
     AND m2.org_id <> m.org_id 
) 
    GROUP BY org_id 
) q 
    ON o.org_id = q.org_id 

输出示例:

 
| ORG_NAME | SHARED_RESOURCES | 
|----------|------------------| 
|  A |    1 | 
|  B |    0 | 
|  C |    1 | 

这里是SQLFiddle演示


要获得重复r的总数跨组织物资跟不上你可以尝试

SELECT o.org_name, COALESCE(q.total, 0) duplicate_resources 
    FROM organization o LEFT JOIN 
(
    SELECT m.org_id, COUNT(DISTINCT mr.res_id) total 
    FROM member_resource mr JOIN members m 
     ON mr.mem_id = m.mem_id 
    WHERE EXISTS 
    (
    SELECT * 
     FROM member_resource mr2 
    WHERE mr2.res_id = mr.res_id 
     AND mr2.sl_no <> mr.sl_no 
) 
    GROUP BY org_id 
) q 
    ON o.org_id = q.org_id 

输出示例:

 
| ORG_NAME | DUPLICATE_RESOURCES | 
|----------|---------------------| 
|  A |     2 | 
|  B |     0 | 
|  C |     1 | 

这里是SQLFiddle演示

+0

重复资源呢? – mbk

+0

查看更新的答案。不幸的是,你没有在解释如何计算它的评论中回答我的问题,所以我尽我所能来推断你的意思。 – peterm

+0

>对不起兄弟。刚才看到你的评论。对于您的信息,如果任何资源出现在多行中而不考虑组织,则将其标识为重复。在这种情况下,你可以检查一下你的SQL是否仍然完美。第一个作品完美。 – mbk