基于mysql中的多个列对行进行分组

时间:2015-05-26 11:39:02

标签: mysql sql group-by full-outer-join

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

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

客户表:

-------------------------
| client_id   | name    |
-------------------------
| client_1    | Bob     |
-------------------------
| client_2    | Jane    |
-------------------------
| client_3    | Amy     |
-------------------------

合约表:

---------------------------------------------
| contract_id | client_id | amount  | date  |
---------------------------------------------
| contract_1 | client_1   | $5      | 01/02 |
---------------------------------------------
| contract_2 | client_1   | $25     | 21/03 |
---------------------------------------------
| contract_3 | client_2   | $40     | 25/05 |
---------------------------------------------

会话表:

------------------------------------------
| session_id  | client_id | contract_id  |
------------------------------------------
| session_1   | client_1  | contract_1   |
------------------------------------------
| session_2   | client_2  | contract_3   |
------------------------------------------
| session_3   | client_2  | contract_3   |
------------------------------------------
| session_4   | client_1  | contract_2   |
------------------------------------------
| session_5   | client_1  | contract_1   |
------------------------------------------

我需要加入表并按client_id和contract_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

我最近的尝试是在表上进行完全外连接,并按client_id和contract_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"每个只返回1行(由于我需要所有的行,这对我来说也不起作用。

在这种情况下,性能完全没有问题。

SQL fiddle based on Ronald's answer

它看起来像我需要的东西。在我批准答案之前,我会将它调整到我的生产表中,看看是否有一些我忽略的东西

1 个答案:

答案 0 :(得分:1)

以下查询是否会提供所需的结果?

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语句的结果总是一个表)

还有一个小问题:为什么client_id是会话表的一部分?它是超定的,这可能会导致数据库中出现歧义。