【问题标题】:MySQL Select From Multiple Tables Based On Common RelationshipsMySQL基于公共关系从多个表中选择
【发布时间】:2012-11-13 18:48:45
【问题描述】:

我有3张表如下:

Table: sys_department
Columns:   dept_id   dept_name
row:       1         Support
row:       2         HR
row:       3         Billing

Table: sys_groups
Columns:   group_id   group_name
row:       1          Manager
row:       2          Intern
row:       3          Staff

Table: group_dept_access
Columns:   group_id   dept_id
row:       1          3
row:       2          1
row:       2          2 
row:       3          1
row:       3          2 

我想运行一个查询来获取组名列表以及他们有权访问的部门名称。

因此,由于 group_dept_access 中的 group_id 为 3,因此将 1 和 2 列为 dept_id,该组将返回其 group_name 的 Billing 以及部门名称 Support 和 HR。

当使用 JOIN 选择 group_dept_access 时,我能够运行查询以获取 group_name,但我不知道如何查询所有三个表并获取部门。

不幸的是,我无法更改表结构,因为如果说第三个表没有每个组的多个条目会很好,但它是一个现有系统,因此如果更改会中断。在当前服务器上也使用 MySQL 5.1.x,但将来将使用 5.5.x。如果这样的查询在版本之间以不同的方式完成,每个版本将如何完成?

感谢任何帮助,因为这将帮助我进行其他类似的查询,我将执行。关于它是如何完成的解释也很好,这样我就可以了解这个 3 表查询是如何完成的。提前谢谢你。

【问题讨论】:

    标签: mysql sql select group-concat


    【解决方案1】:

    试试这个:

    SELECT sg.group_name, A.dept_name 
    FROM sys_groups sg 
    INNER JOIN (SELECT gda.group_id, GROUP_CONCAT(sd.dept_name SEPARATOR '|') dept_name
                FROM group_dept_access gda 
                INNER JOIN sys_department sd ON gda.dept_id = sd.dept_id 
                GROUP BY gda.group_id) AS A ON sg.group_id = A.group_id 
    

    【讨论】:

    • 效果很好!谢谢你。当 dept_name 连接在一起时,一个简单的问题是使用逗号完成的,是否可以指定要使用的字符并使用 '|'反而?以防万一部门名称或组中包含逗号。
    【解决方案2】:
    SELECT g.group_id, g.group_name, d.dept_id, d.dept_name
    FROM sys_department d,
    sys_groups g,
    group_dept_access gd
    WHERE d.dept_id = gd.dept_id
    AND g.group_id=gd.group_id
    

    【讨论】:

    • 这不会返回任何组或部门的名称。
    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2015-09-13
    相关资源
    最近更新 更多