网易首页 > 网易号 > 正文 申请入驻

MySQL多列字段去重的案例实践

0
分享至

同事提了个需求,如下测试表,有code、cdate和ctotal三列,

select * from tt;

现在要得到code的唯一值,但同时带着cdate和ctotal两个字段。

提起"唯一值",想到的就是distinct。distinct关键字可以过滤多余的重复记录只保留一条。

distinct支持单列去重和多列去重,如果是单列去重,简明易懂,即相同值只保留1个,如下所示,

select distinct code from tt;

多列去重则是根据指定的去重列信息进行,即只有所有指定的列信息都相同,才会被认为是重复的信息,如下所示,code、cdate和ctotal都相同,才会返回记录,因此不是字面上的理解,即只要code是distinct的,cdate和ctotal无需关注。实际上当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧贴着它的一个字段,即distinct同时作用了三个字段,code、cdate和ctotal,并不只是code字段,

select distinct code, cdate, ctotal from tt;

而且distinct只能放到所有字段的前面,如果像这种,distinct之前有其它字段,则会提示错误,

select cdate, ctotal, distinct code from tt;

SQL 错误 [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'distinct code from tt' at line 1

但是如上SQL使用distinct关键字,并没有满足需求,即得到code的唯一值,但同时带着cdate和ctotal两个字段,可以看到有很多相同的code。

除了distinct,group by子句也可以去重,从需求的理解上,如果按照code做group by,应该就可以得到唯一的code了,但是实际执行,提示这个错误,

selectcode,cdate,ctotalfromttgroupbycode;

SQL 错误 [1055] [42000]: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.tt.code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

很常见的错误,因为sql_mode中含only_full_group_by规则,

show variables like '%sql_mode%';

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

only_full_group_by规则是指对group by进行查询的SQL,不允许select部分出现group by中未出现的字段,也就是select查询的字段必须是group by中出现的或者使用聚合函数的,即校验更加严格。

P.S. MySQL不同版本sql_mode默认值可能是不同的,因此在数据库升级配合的应用迁移过程中,尤其要注意像only_full_group_by这种校验规则的改变,很可能是个坑。

仅针对当前这个问题,可以在会话级,修改sql_mode,调整校验的强度,删除only_full_group_by,

set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

此时,使用group by,

select code, cdate, ctotal from tt group by code;

就可以得到想要的效果了,

除了group by,还可以使用group_concat函数,配合distinct,达到相同效果。

我们分解来做,可以看到group_concat(code),得到的是所有记录的code值拼接成新字段,

select group_concat(code), cdate, ctotal from tt group by code;

group_concat中加上distinct,就可以过滤所有的重复值,满足了需求,

select group_concat(distinct code), cdate, ctotal from tt group by code;

当然,这种在会话级通过改动sql_mode实现的路径,还需要考虑场景,因为缺少only_full_group_by的校验,按照code聚类了,但cdate和ctotal的值很可能是不唯一的,返回的结果,只能准确描述code的数据情况,不能代表cdate和ctotal的真实数据情况。因此,任何方案的选择,都需要结合实际的场景需求,我们找的方案,不一定是最好的,但需要最合适的。

本文关键字:#SQL# #去重#

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
4人被查,3人被处分……

4人被查,3人被处分……

黄河新闻网吕梁频道
2024-06-15 08:41:51
中美俄五代机速度对比:美国2.25马赫,俄罗斯2马赫,中国是多少

中美俄五代机速度对比:美国2.25马赫,俄罗斯2马赫,中国是多少

乐阳聊军事
2024-06-15 10:51:00
我在尼泊尔卖手机,经客户做媒,花15000元娶小17岁美女,赚大了

我在尼泊尔卖手机,经客户做媒,花15000元娶小17岁美女,赚大了

真实人物采访
2024-06-14 06:15:02
沈阳地头蛇看上加代媳妇,趁拍戏对她侵犯,加代用尽力量复仇杀红眼

沈阳地头蛇看上加代媳妇,趁拍戏对她侵犯,加代用尽力量复仇杀红眼

古今档案
2024-05-20 16:03:56
黑龙江车祸惨烈!5人遇难,4名竟是刚高考完的学生,令人心痛。

黑龙江车祸惨烈!5人遇难,4名竟是刚高考完的学生,令人心痛。

小毅讲历史
2024-06-16 06:00:27
怪不得哈尔科夫俄军偃旗息鼓了,原来乌军采取了这么一个动作

怪不得哈尔科夫俄军偃旗息鼓了,原来乌军采取了这么一个动作

听风听你
2024-06-13 11:16:52
又上当了!老美急哭:我只是想吓吓你们而已,不要当真啊

又上当了!老美急哭:我只是想吓吓你们而已,不要当真啊

芯怡飞
2024-06-10 10:49:06
昆明一电动汽车自燃致人死?印度事、日本车、“台毒”分子造的谣

昆明一电动汽车自燃致人死?印度事、日本车、“台毒”分子造的谣

不掉线电波
2024-06-15 09:13:41
曼联4200万可签德里赫特!拉爵或改变新中卫目标,大英铁卫亦候选

曼联4200万可签德里赫特!拉爵或改变新中卫目标,大英铁卫亦候选

罗米的曼联博客
2024-06-16 09:09:49
回顾上海华山医生杀妻细节曝光,疑与出轨有关,妻子执意打掉二胎

回顾上海华山医生杀妻细节曝光,疑与出轨有关,妻子执意打掉二胎

琪琪故事记
2024-06-16 07:17:04
1949年,王震开会迟到半小时,彭德怀要给处分,王震:那先处分你

1949年,王震开会迟到半小时,彭德怀要给处分,王震:那先处分你

简史档案馆
2024-06-15 10:21:38
汶川9岁英雄,被姚明抱上奥运会,发誓考清华,16年后竟活成这样

汶川9岁英雄,被姚明抱上奥运会,发誓考清华,16年后竟活成这样

华人星光
2024-06-14 16:18:28
上海第一“鬼站”漕宝路地铁站:殡仪馆停尸房围在四周,诡事频出

上海第一“鬼站”漕宝路地铁站:殡仪馆停尸房围在四周,诡事频出

神秘历史故事
2023-06-29 15:56:50
广东深圳,男子喜获双胞胎儿子,可他无意间发现,两个儿子竟然两个爹

广东深圳,男子喜获双胞胎儿子,可他无意间发现,两个儿子竟然两个爹

娱乐圈见解说
2024-06-16 07:05:18
2-0!瑞士“廉价前锋”破门,利物浦巨星全场隐身,破欧洲杯纪录

2-0!瑞士“廉价前锋”破门,利物浦巨星全场隐身,破欧洲杯纪录

汪星人哟
2024-06-15 21:50:55
吴谨言横店剧组被偶遇,又瘦又矮法令纹明显,脸巴掌大还有点垮

吴谨言横店剧组被偶遇,又瘦又矮法令纹明显,脸巴掌大还有点垮

娱记掌门
2024-06-15 18:28:27
银行取钱要派出所同意?相关方自己都知不合理了,还有人帮着吹?

银行取钱要派出所同意?相关方自己都知不合理了,还有人帮着吹?

走读新生
2024-06-13 10:32:30
反击号角吹响!中国三大部门宣布,断供关键设备及软件

反击号角吹响!中国三大部门宣布,断供关键设备及软件

科技丰
2024-06-15 13:07:49
iPhone 16会杀死大模型APP吗?

iPhone 16会杀死大模型APP吗?

字母榜
2024-06-15 11:56:07
美媒:中国已经“出手”了,而美国感到紧张了

美媒:中国已经“出手”了,而美国感到紧张了

新时光点滴
2024-06-16 04:40:02
2024-06-16 12:08:49
爱可生云数据库
爱可生云数据库
企业数据处理技术整体解决方案
411文章数 20关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

法国股市暴跌引发恐慌 马克龙:法国处于非常严峻时刻

头条要闻

法国股市暴跌引发恐慌 马克龙:法国处于非常严峻时刻

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

房产
时尚
亲子
艺术
健康

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

中年女性还是穿连衣裙最有气质!裙摆过膝、腰部收紧,巨显瘦

亲子要闻

孩子吃饭时习惯让别人盛饭,外婆是这样做的...

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

晚餐不吃or吃七分饱,哪种更减肥?

无障碍浏览 进入关怀版