在mysql中基于多列对行进行分组

在mysql中基于多列对行进行分组,mysql,sql,group-by,full-outer-join,Mysql,Sql,Group By,Full Outer Join,解释我的问题最简单的方法可能是显示表格和我试图得到的结果。我最近尝试的查询位于底部(不起作用) 我有以下表格(为了简单起见,删除了一些列): 客户表: 合同表: 会话表: 我需要连接表,并按客户机id和合同id对所有行进行分组,如下所示: client 1, Bob |___ contract_1, $5, 01/02 |___ Session 1 |___ Session 5 |___ contract_2, $25, 21/

解释我的问题最简单的方法可能是显示表格和我试图得到的结果。我最近尝试的查询位于底部(不起作用)

我有以下表格(为了简单起见,删除了一些列):

客户表:

合同表:

会话表:

我需要连接表,并按客户机id和合同id对所有行进行分组,如下所示:

client 1, Bob
     |___ contract_1, $5, 01/02
            |___ Session 1
            |___ Session 5
     |___ contract_2, $25, 21/03
            |___ Session 4
client 2, Jane
     |___ contract_3, $40, 25/05
            |___ Session 2
            |___ Session 3
client 3, Amy
我最近的一次尝试是对表进行完全外部联接,并按客户机id和合同id对结果进行分组

SELECT * FROM    
    (SELECT
        *
    FROM
        contracts
    LEFT OUTER JOIN 
        clients
    ON 
        clients.client_id = contracts.client_id       
    UNION 
    SELECT
        *
    FROM
        contracts
    LEFT OUTER JOIN 
        sessions
    ON 
        sessions.client_id = contracts.client_id)
AS tmp_table GROUP BY client_id, contract_id
完全外部联接解决方案失败,因为不同表中的列数不同(我需要所有列,所以我在那里运气不佳),而且“GROUP BY”看起来只返回每一行中的一行(这对我也不起作用,因为我需要所有行)

在这种情况下,性能根本没有问题



看起来它满足了我的需要。我会将它调整到我的生产表中,并在批准答案之前查看是否有我忽略的内容

以下查询是否会给出所需的结果

select cl.client_id, cl.name, co.contract_id, co.amount, co.date, se.session_id
from (client cl left join contract co
     on cl.client_id = co.client_id) left join session se
                 on co.contract_id = se.contract_id
order by cl.client_id, co.contract_id, se.session_id
(正如其中一条注释中所指出的:select语句的结果始终是一个表)


还有一个小问题:为什么客户端id是会话表的一部分?它是过度确定的,这可能会导致数据库中的歧义。

SQL结果集是以表的形式出现的,具有固定的列定义。请将所需的结果格式化为表,以便我们了解您正在尝试执行的操作。这也会非常有用l设置。@GordonLinoff我不确定最好的表格格式是什么,这就是为什么我发布了我要做的,而不是表格。
client 1, Bob
     |___ contract_1, $5, 01/02
            |___ Session 1
            |___ Session 5
     |___ contract_2, $25, 21/03
            |___ Session 4
client 2, Jane
     |___ contract_3, $40, 25/05
            |___ Session 2
            |___ Session 3
client 3, Amy
SELECT * FROM    
    (SELECT
        *
    FROM
        contracts
    LEFT OUTER JOIN 
        clients
    ON 
        clients.client_id = contracts.client_id       
    UNION 
    SELECT
        *
    FROM
        contracts
    LEFT OUTER JOIN 
        sessions
    ON 
        sessions.client_id = contracts.client_id)
AS tmp_table GROUP BY client_id, contract_id
select cl.client_id, cl.name, co.contract_id, co.amount, co.date, se.session_id
from (client cl left join contract co
     on cl.client_id = co.client_id) left join session se
                 on co.contract_id = se.contract_id
order by cl.client_id, co.contract_id, se.session_id