mysql group by聚合字段合并_mysql groupby 字段合并问题(group_concat)

在我们的日常mysql查询中,我们可能会遇到这样的情况:

对表中的所有记录进行分类,并且我需要得到每个分类中某个字段的全部成员。

上面的话,大家看起来可能不太好懂,下面举一个例子来给大家说明。

现在我们有一张表,结构如下:

d0a31b98c5e652a7410a839dd3a38067.png

现在我们向这张表中插入一些数据。

insert into test_group_concat  values(default,1,'ppaa',1594802453,0),(default,1,'llcc',1594802453,0),(default,2,'uupp',1594802453,0),(default,2,'ttww',1594802453,0)

现在我们可以看到,数据表的情况如下:

c36c6b38988e86b5ff8f18f5c54706b7.png

我的需要是这样的:我需要对type_id进行分组,而且每个分组下的所有name我都要得到,这个是后应该怎么办呢?

这样写:select type_id,name from test_group_concat GROUP BY type_id

我们得到的结果是这样的:

6c3534917907e551af14b4c366bfc876.png

上面每个type_id对应只有一个name,这显然不符合我们的需求,我们的需求是需要找出type_id = 1 这个分类下所有的name,和type_id = 2的所有的name。

怎么办呢?

有朋友会想到,“用concat就可以解决问题了嘛!”,好的,我们现在试一下。

select type_id,concat(name) as names from test_group_concat GROUP BY type_id

结果如下:

59d828e18cbf74dd8e2ac2fdf110602e.png

很显然,没有达到我们的预期,怎么办!!!

mysql中给我们提供了一个函数:group_concat,利用这个函数,我们就能够很好的解决上述问题。我们试一下。

select type_id,group_concat(name) as names from test_group_concat GROUP BY type_id

结果如下:

558053cccd878502b84879d03594106d.png

上述结果,很好的满足了我们的需求。

那有朋友就会问了,如果我不仅想知道分类某个字段的全部信息,我还想要某两个字段连接在一起的所有信息,我们可以这么去写。

select type_id,group_concat(id,',',name) as names from test_group_concat GROUP BY type_id

d7f06adff46a09c75949dbdfcd558081.png

### MySQL GROUP BY 使用非聚合字段的正确方法及解决方案 在 MySQL 中,当启用 `ONLY_FULL_GROUP_BY` 模式时,如果在 `SELECT` 列表中包含未聚合字段,并且这些字段未出现在 `GROUP BY` 子句中,则会导致错误[^1]。此问题的根本原因是 SQL 标准要求 `GROUP BY` 子句中的字段必须能够唯一标识每一组数据,而未聚合字段可能无法满足这一条件。 以下是几种解决此问题的方法: #### 方法一:调整 SQL_MODE 禁用 ONLY_FULL_GROUP_BY 可以通过修改 MySQL 的 `sql_mode` 来禁用 `ONLY_FULL_GROUP_BY` 模式。具体操作如下: ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 或者仅针对当前会话进行设置: ```sql SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 这种方法虽然可以快速解决问题,但可能会导致查询结果不符合预期,因为未聚合字段值可能来自任意一行[^3]。 #### 方法二:将所有非聚合字段添加到 GROUP BY 子句中 为了符合 SQL 标准并避免报错,可以将 `SELECT` 列表中所有的非聚合字段都添加到 `GROUP BY` 子句中。例如: ```sql SELECT name, sex, SUM(money) FROM test1 GROUP BY name, sex; ``` 这种方式确保了每组数据由 `GROUP BY` 子句中的字段唯一标识,从而避免了 `ONLY_FULL_GROUP_BY` 模式的限制[^4]。 #### 方法三:使用聚合函数处理非聚合字段 对于不需要明确指定值的非聚合字段,可以使用聚合函数(如 `MIN()` 或 `MAX()`)来处理。例如: ```sql SELECT name, MAX(sex), SUM(money) FROM test1 GROUP BY name; ``` 这种方法假设非聚合字段的值在每组中是一致的,或者用户不关心具体值的选择[^2]。 #### 方法四:使用子查询或派生表 通过子查询或派生表,可以先对需要聚合的数据进行处理,然后再选择其他字段。例如: ```sql SELECT t.name, t.sex, v.total_money FROM test1 AS t JOIN ( SELECT name, SUM(money) AS total_money FROM test1 GROUP BY name ) AS v ON t.name = v.name; ``` 这种方式可以灵活地控制哪些字段参与聚合,同时避免直接违反 `ONLY_FULL_GROUP_BY` 模式[^5]。 #### 方法五:使用 GROUP_CONCAT 合并字段 如果需要将多个字段合并为一个字符串,可以使用 `GROUP_CONCAT` 函数。例如: ```sql SELECT name, GROUP_CONCAT(sex SEPARATOR ',') AS sexes, SUM(money) FROM test1 GROUP BY name; ``` 这种方法适用于需要展示多个值的情况,但需要注意结果字符串的长度限制[^5]。 --- ### 示例代码 以下是一个综合示例,展示了如何结合上述方法解决 `GROUP BY` 报错问题: ```sql -- 方法二:将所有非聚合字段添加到 GROUP BY 子句中 SELECT name, sex, SUM(money) FROM test1 GROUP BY name, sex; -- 方法三:使用聚合函数处理非聚合字段 SELECT name, MAX(sex), SUM(money) FROM test1 GROUP BY name; -- 方法四:使用子查询或派生表 SELECT t.name, t.sex, v.total_money FROM test1 AS t JOIN ( SELECT name, SUM(money) AS total_money FROM test1 GROUP BY name ) AS v ON t.name = v.name; -- 方法五:使用 GROUP_CONCAT 合并字段 SELECT name, GROUP_CONCAT(sex SEPARATOR ',') AS sexes, SUM(money) FROM test1 GROUP BY name; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值