去重多个字段以及group by 内连接 in 失效

本文分享了在MySQL中使用COUNT函数与GROUP BY语句的实际经验,通过具体案例展示了如何统计重复名称的数量,并讨论了GROUP BY与ORDER BY、LIMIT子句的正确使用顺序,以及一种更简便的查询方法。

文贴:https://www.cnblogs.com/52fhy/p/4978001.html

文贴转自:http://www.php100.com/html/webkaifa/database/Mysql/2008/0818/1118.html

 

赶紧用count函数一试,成功,我。。。。。。。想哭啊,费了这么多工夫。。。。。。。。原来就这么简单……

现在将完整语句放出:

 
select *, count(distinct name) from table group by name

结果:

 
id name count(distinct name) 1 a 1 2 b 1 3 c 1

最后一项是多余的,不用管就行了,目的达到。

唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧(对了,还有容容那家伙),现在拿出来希望大家不要被这问题折腾。

哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错.

更郁闷的事情发生了,在准备提交时容容发现,有更简单的解决方法:

 
select id, name from table group by name

 

SELECT * FROM table a WHERE a.ID  in(
SELECT b.ID FROM table b GROUP BY b.aa,b.bb)

这种情况in内查询会将未group by的数据列出

 

### 使用 SQL 拼接字段内容为单个字符串的方法 在 SQL 中,`GROUP_CONCAT` 是一种强大的函数,用于将分组后的多条记录合并成一个字段[^1]。它可以处理多个值并将其拼接为单个字符串,适用于多种场景,例如、设置长度限制等。 #### 调整 `GROUP_CONCAT` 的长度限制 默认情况下,`GROUP_CONCAT` 的最大长度受到 `group_concat_max_len` 参数的限制。如果需要调整该限制,可以通过以下方式实现: ```sql SET GLOBAL group_concat_max_len = 10240; -- 全局生效,启后失效 SET SESSION group_concat_max_len = 10240; -- 当前会话生效 ``` 通过上述语句,可以将拼接结果的最大长度扩展到 10240 字节。需要注意的是,全局设置仅对当前会话有效,服务器启后将恢复默认值[^1]。 #### 使用 `GROUP_CONCAT` 实现字段拼接 假设有一张表 `t_wjdc_answer_exception`,需要按照 `ansuid` 字段分组,并将 `error_msg` 字段的内容拼接成一个字符串。以下是实现方法: ```sql SELECT a.ansuid, GROUP_CONCAT(DISTINCT a.error_msg SEPARATOR ',') AS error_msg FROM t_wjdc_answer_exception a WHERE a.deleteflg = '0' GROUP BY a.ansuid; ``` - `DISTINCT`:确保拼接时复值。 - `SEPARATOR ','`:指定拼接时使用的分隔符,默认为逗号`,`。 - `GROUP BY a.ansuid`:按 `ansuid` 字段分组。 #### 示例数据与结果 假设表中有以下数据: | ansuid | error_msg | deleteflg | |----------------|---------------|-----------| | 02b00813bdf7 | Error A | 0 | | 02b00813bdf7 | Error B | 0 | | d7f5f66ff4da | Error C | 0 | | d7f5f66ff4da | Error C | 0 | 执行上述查询后,结果如下: | ansuid | error_msg | |----------------|------------------| | 02b00813bdf7 | Error A,Error B | | d7f5f66ff4da | Error C | #### 动态生成 IN 条件 在实际开发中,`IN` 子句中的值可以通过动态 SQL 生成。例如使用 MyBatis 的 `<foreach>` 标签: ```xml <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> ``` 此代码片段将列表中的值转换为逗号分隔的形式,供 SQL 查询使用[^2]。 #### 注意事项 - 如果拼接结果超出 `group_concat_max_len` 的限制,多余部分将被截断。 - `GROUP_CONCAT` 的性能可能受数据量和复杂度影响,在大数据量场景下需谨慎使用。 ### 示例代码 以下是一个完整的 SQL 示例,展示如何使用 `GROUP_CONCAT` 拼接字段内容: ```sql SELECT a.ansuid, GROUP_CONCAT(DISTINCT a.error_msg ORDER BY a.error_msg ASC SEPARATOR '|') AS error_msg FROM t_wjdc_answer_exception a WHERE a.deleteflg = '0' GROUP BY a.ansuid HAVING a.ansuid IN ('02b00813bdf7', 'd7f5f66ff4da'); ``` - `ORDER BY a.error_msg ASC`:按字母顺序排列拼接内容。 - `SEPARATOR '|'`:使用竖线作为分隔符。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值