mysql - 针对特定问题的复杂 MySQL 查询

标签 mysql sql select join group-by

我已经搜索并浏览了与我的相似的可用主题。但是,没能找到满足我要求的。因此,将其张贴在这里。

我有如下四个表:

"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      | res_prop    |
| 1            | resource1     | prop-1      |
| 2            | resource2     | prop-2      |
| 3            | resource3     | prop-3      |
| 4            | resource4     | prop-4      |
| 5            | resource1     | prop-5      |
| 6            | resource2     | prop-6      |

在上表中应用了 UNIQUE INDEX (res_name, res_prop) 的约束。

"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            |
| 8            | 1          | 5            |
| 9            | 1          | 6            |

我想从 Resource 表中找出特定组织的多个 res_prop 中不同的 res_name。例如,组织 A 的预期输出如下:

| res_name       | res_prop_count       |
| resource1      | 2                    |
| resource2      | 2                    |

在这方面的任何帮助将不胜感激。

问候。

最佳答案

当做这样的事情时,你应该逻辑地构建你的查询,以便开始从组织 A 获取你的所有资源和 Prop

SELECT  r.res_name,
        r.res_prop
FROM    Resource r
        INNER JOIN `member-resource` mr
            ON mr.res_id = r.res_id
        INNER JOIN Members m
            ON m.mem_id = mr.mem_id
        INNER JOIN Organization o
            ON o.org_id = m.org_id
WHERE   o.org_name = 'A'

然后你就可以开始考虑你要怎么过滤了,所以你想找到有多个不同res_prop的资源名称,所以你需要根据res_name进行分组,并应用一个HAVING子句来限制为res_names with不止一个不同的 res_prop:

SELECT  r.res_name,
        COUNT(DISTINCT r.res_prop) AS res_prop_count
FROM    Resource r
        INNER JOIN `member-resource` mr
            ON mr.res_id = r.res_id
        INNER JOIN Members m
            ON m.mem_id = mr.mem_id
        INNER JOIN Organization o
            ON o.org_id = m.org_id
WHERE   o.org_name = 'A'
GROUP BY r.res_name
HAVING COUNT(DISTINCT r.res_prop) > 1;

Example on SQL Fiddle

关于mysql - 针对特定问题的复杂 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856705/

相关文章:

mysql - 从 Laravel 应用程序备份数据库

php - 如何正确导出到包含带逗号的表记录值的 CSV 文件?

mysql - 关于重复 key 更新...如何更新自动增量?

mysql - 一个 SQL 语句中的两个不同分组

java - 我可以在 java 中设置一些配置标志 null == null 是 false 还是 true?

c# - 由于 : Unable to load one or more of the requested types. 导致无法导出检索 LoaderExceptions 属性以获取更多信息。

sql - 为什么 SQL Server 不支持无符号数据类型?

mysql - SQL查询在内部连接到右表后从左表中选择不同的行

select - mat-select 在 mat-expansion-panel 中不起作用

C#、MySql Select语句