ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-03-10 21:04:29  阅读:244  来源: 互联网

标签:COMMENT group NAME 数据库 YUWEN VALUE 查询 VARCHAR ANY


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='测试表';

数据库环境:MYSQL 5.7.19
解决group by只能查询特定字段而不能查询其他字段的问题。

 

现在我的查询需求是得到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 ;

这种方式的缺点是无法得到其他字段的值。

下面有两种方式可以解决这个缺点:
方法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;

 

结果:当然了也支持聚合函数查询

 

 

注意:可以对列重命名。另外,对于重复的记录默认取第一条,但可以根据实际需求来选择。

方法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)

 

 

 

 

 

 

 

注意:发现重复的记录取的是di最大的那个。

两个方法对比:

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

综上,推荐方法1!

 

标签:COMMENT,group,NAME,数据库,YUWEN,VALUE,查询,VARCHAR,ANY
来源: https://www.cnblogs.com/ysySelf/p/14514155.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有