iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql -- 左连接一对多只取一条,去重重复字段
  • 786
分享到

mysql -- 左连接一对多只取一条,去重重复字段

mysql数据库 2023-08-31 14:08:12 786人浏览 薄情痞子
摘要

背景:         例如,给你一张用户表,还有一张地区信息表(每条数据都是到省 - 市 - 县 的地区信息,具体到县区),用户表中有用户所在市区字段,你要根据 地区信息表 查用户的所在市区的市区编码。就会出现一个情况,用户表 左连接 地

背景:

        例如,给你一张用户表,还有一张地区信息表(每条数据都是到省 - 市 - 县 的地区信息,具体到县区),用户表中有用户所在市区字段,你要根据 地区信息表 查用户的所在市区的市区编码。就会出现一个情况,用户表 左连接 地区信息表  根据市区信息去匹配,一对多(比如惠州有7的县区),这个时候你只要随机的一条就够不需要多条,现在就考虑如何去重

sql大概如下:

        select  用户表id, 用户字段,市区编码   

        from 用户表

        left join 地区信息表  on  用户市区 = 地区表市区

尝试一:

        使用 DISTINCT

修改sql:

        select  DISTINCT 用户表id, 用户字段,市区编码   

        from 用户表

        left join 地区信息表  on  用户市区 = 地区表市区

结果:

        没用,原因是 Mysql的DISTINCT关键字,是后面跟多少个字段,就是多少个字段一起组合,组合后所有字段一样才会去重, 并不是说你在id前面,就会对id字段一样的数据去重(老实说个人觉得这个关键字很鸡肋,查询的所有字段完全一样才去重,基本就是相当于表中有两条一模一样的数据,一般都不可能),由于市区编码不同县区不一样,所以这个关键字根本去不了重

尝试二:

        使用分组 group by

修改sql:

        select  用户表id, 用户字段,市区编码   

        from 用户表

        left join 地区信息表  on  用户市区 = 地区表市区

        group by 用户表id

结果:

        可以实现,因为根据分组后,多条数据的用户id是相同的,分到同一组,所以查询就剩下一条了,这样你取到的市区编码就是随机的一条

        但是,银行mysql后面的版本有个ONLY_FULL_GROUP_BY 这个设置,大概的意思就是,你如果使用group by,那么你的select 的字段必须是group by中的分组字段,或者其他的使用了聚合函数的字段。所以 (select  用户表id, 用户字段,市区编码   ) 是会报错的,只能用 (select  用户表id),或者根据三个字段一起分组(group by  用户表id, 用户字段,市区编码   ),但是又相当于没分组了,而且正常的项目查询的字段何止三个,肯定不能都分组,效率很低,所以也不行,除非你关了上面这个ONLY_FULL_GROUP_BY ,或者使用低版本mysql

尝试三:

        这次是使用子查询的方法,在子查询中使用group by,让子查询里变成一个市区一条数据而不是原来的一个县区一个数据

修改sql:

        select  用户表id, 用户字段,市区编码   

        from 用户表

        left join 

                (select 地区表市区 ,max(市区编码) 

                from 地区信息表

                group by 地区表市区

                ) as d 

                on  用户市区 = d.地区表市区

结果:

        成功,在子查询中,用分组已经得到一个市区一条数据,然后用max聚合函数查到最大的市区编码(相当于随机获取其中一条),这样子查询和用户表的数据就是一对一,就可以实现我们的需要

结语:

        上送需求是我根据我实际工作遇到的举例出来的,相信也有不少朋友遇到相同的,上述仅代表我个人的处理过程和意见,如果朋友们有其他更好的方法也请不吝赐教,谢谢

来源地址:https://blog.csdn.net/DGH2430284817/article/details/131458684

您可能感兴趣的文档:

--结束END--

本文标题: mysql -- 左连接一对多只取一条,去重重复字段

本文链接: https://www.lsjlt.com/news/385828.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-14
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-14
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-14
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-14
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-14
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-14
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-14
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-14
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作