mysql进行分组查询时,怎么把count(*)也封装到java bean里?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql进行分组查询时,怎么把count(*)也封装到java bean里?相关的知识,希望对你有一定的参考价值。

目前直接用query runner可以直接分装其他属性!
sql语句如下:select goods_Name, goods_Mode, goods_Status, goods_Keeper_Name, manage_Location, count(*) from goods
where goods_Status like '%在库%' group by goods_Name ,goods_Mode ,goods_Status ,goods_Keeper_Name ,manage_Location limit 0,8;(查询结果如附图)

javabean 如下:
private String goods_Name;
private String goods_Count;(将count(*)封装到该属性内)
其他略....

给你举个例子,你自己按照你所在当前表的情况来进行查询。

例如:

select 列1 avg(列2) as xz from 表 group by 列1 order by xz desc ;

解释:
avg()函数是求某列的平均值,group by是对某列分组,按照SQL标准,分组要和聚合函数一起配合使用才有意义[虽然在mysql中不会报错]。order by xz desc表示的是对xz进行降序,就可以把最高的平均值算出来。追问

感谢回答,虽然没答到点上,但是还是给了我灵感,最后我的做法是:将count(*) as goods_Count,这样就和java bean对象的属性名称匹配上了!!这样就顺利地讲数据封装进java bean里了。
sql如下:
select goods_Name, goods_Mode, goods_Status, goods_Keeper_Name, manage_Location,count(*) as goods_Count from goods group by goods_Name ;

参考技术A

我们知道,MySQL 一直依赖对 count(*) 的执行很头疼。很早的时候,MyISAM 引擎自带计数器,可以秒回;不过 InnoDB 就需要实时计算,所以很头疼。以前有多方法可以变相解决此类问题,比如:
1. 模拟 MyISAM 的计数器比如表 ytt1,要获得总数,我们建立两个触发器分别对 insert/delete 来做记录到表 ytt1_count,这样只需要查询表 ytt1_count 就能拿到总数。ytt1_count 这张表足够小,可以长期固化到内存里。不过缺点就是有多余的触发器针对 ytt1 的每行操作,写性能降低。这里需要权衡。


2. 用 MySQL 自带的 sql_calc_found_rows 特性来隐式计算

依然是表 ytt1,不过每次查询的时候用 sql_calc_found_rows 和 found_rows() 来获取总数,比如:

    1 row in set, 1 warning (0.00 sec)

    这样的好处是写法简单,用的是 MySQL 自己的语法。缺点也有,大概有两点:1. sql_calc_found_rows 是全表扫。2. found_rows() 函数是语句级别的存储,有很大的不确定性,所以在 MySQL 主从架构里,语句级别的行级格式下,从机数据可能会不准确。不过行记录格式改为 ROW 就 OK。所以最大的缺点还是第一点。

    从 warnings 信息看,这种是 MySQL 8.0 之后要淘汰的语法。

    3. 从数据字典里面拿出来粗略的值


    那这样的适合新闻展示,比如行数非常多,每页显示几行,一般后面的很多大家也都不怎么去看。缺点是数据不是精确值。

    4. 根据表结构特性特殊的取值

    这里假设表 ytt1 的主键是连续的,并且没有间隙,那么可以直接  mysql> select max(id) as cnt from ytt1;    +------+    | cnt  |    +------+    | 3072 |    +------+    1 row in set (0.00 sec)


    不过这种对表的数据要求比较高。


    5. 标准推荐取法(MySQL 8.0.17 建议)

    MySQL 8.0 建议用常规的写法来实现。

    第五种写法是 MySQL 8.0.17 推荐的,也就是说以后大部分场景直接实时计算就 OK 了。MySQL 8.0.17 以及在未来的版本都取消了sql_calc_found_rows 特性,可以查看第二种方法里的 warnings 信息。相比 MySQL 5.7,8.0 对 count(*) 做了优化,没有必要在用第二种写法了。我们来看看 8.0 比 5.7 在此类查询是否真的有优化?MySQL 5.7

    请点击输入图片描述

MySQL查询之分组查询

一、分组

按照字段分组,表示此字段相同的数据会被放到一个组中

分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中

可以对分组后的数据进行统计,做聚合运算

语法如下:

select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

查询男女生总数

select gender as 性别,count(*)
from students
group by gender;

查询各城市人数

select hometown as 家乡,count(*)
from students
group by hometown;

二、分组后的数据筛选

语法如下:

select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...

having后面的条件运算符与where的相同

查询男生总人数

方案一
select count(*)
from students
where gender=1;
-----------------------------------
方案二:
select gender as 性别,count(*)
from students
group by gender
having gender=1;

三、对比where与having

where是对from后面指定的表进行数据筛选,属于对原始数据的筛选

having是对group by的结果进行筛选

以上是关于mysql进行分组查询时,怎么把count(*)也封装到java bean里?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle查询语句怎么样按天分组

MySQL 怎样分组查询

子查询分组后主查询怎么接收count

mysql 分组子查询sql怎么写

MySQL聚合函数

MySQL管理和查询数据:连接查询基础