数据库|group by查询出其他字段

数据库相关 专栏收录该内容
2 篇文章 0 订阅
数据库环境:MYSQL 5.7.19
解决group by只能查询特定字段而不能查询其他字段的问题。
新建一张表:
CREATE TABLE LSQ_TEST_TABLE (
        ID VARCHAR(64) NOT NULL COMMENT '主键',
        NAME VARCHAR(10) COMMENT '姓名',
        CLASS VARCHAR(10) COMMENT '班级',
        YUWEN VARCHAR(10) COMMENT '语文',
        SHUXUE VARCHAR(10) COMMENT '数学',
        ENGLISH VARCHAR(10) COMMENT '英语',
        PHYSICS VARCHAR(10) COMMENT '物理',
        CREATTIME VARCHAR(19) COMMENT '创建时间',
        PRIMARY KEY (ID),
        INDEX IDX_NAME (NAME)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';

插入几条数据后,查询结果:
11

现在我的查询需求是得到NAME和YUWEN去重的结果。

传统的办法是采用group by或者distinct关键字,看下面:

select NAME, YUWEN FROM lsqsit.lsq_test_table GROUP BY NAME, YUWEN;
select distinct NAME,YUWEN FROM lsqsit.lsq_test_table ;

两条SQL执行结果都为:
22
这种方式的缺点是无法得到其他字段的值

下面有两种方式可以解决这个缺点:
方法1:使用ANY_VALUE()字段。

SQL如下:

SELECT ANY_VALUE(ID),ANY_VALUE(NAME),ANY_VALUE(YUWEN),ANY_VALUE(ENGLISH),ANY_VALUE(SHUXUE),ANY_VALUE(PHYSICS),ANY_VALUE(CREATETIME) FROM lsq_test_table where lsq_test_table.CLASS = "1" GROUP BY NAME, YUWEN;

这个查询到的结果为:
33
注意:可以对列重命名。另外,对于重复的记录默认取第一条,但可以根据实际需求来选择。

方法2:使用组合查询。

思路是:①首先根据排重字段NAME和YUWEN进行group by,然后对group by的每个结果去最大id,即MAX(id);②然后从主表中找到这些id的记录。

SELECT id,name,yuwen,shuxue,english,physics,createTime FROM lsq_test_table WHERE id IN(SELECT MAX(id) FROM lsq_test_table where CLASS = "1" GROUP BY NAME, YUWEN)

这个查询的结果为:
44
注意:发现重复的记录取的是di最大的那个。

两个方法对比:

方法1只会对数据库查询一次,而方法2会查询库两次;
方法2中in()函数没有索引,因此如果你id数量足够多的话,那么查询会很慢;

综上,推荐方法1

  • 4
    点赞
  • 8
    评论
  • 14
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 8 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

Starry-

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值