2013-12-14 102 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