gpt4 book ai didi

mysql - 根据mysql中的多列对行进行分组

转载 作者:行者123 更新时间:2023-11-28 23:59:21 26 4
gpt4 key购买 nike

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

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

客户表:

-------------------------
| 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 表:

------------------------------------------
| 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

看起来它满足了我的需要。我会根据我的生产表进行调整,看看是否有我忽略的地方,然后再批准答案

最佳答案

下面的查询会给出想要的结果吗?

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 是 session 表的一部分?它被过度确定,这可能会导致您的数据库中出现歧义。

关于mysql - 根据mysql中的多列对行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30457472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com