1、情形
刚接到一个新加需求,需要加一个分组查询功能。大概就是要有一个下拉框,给下拉框自定义枚举值,选中其中一个,那么页面上的列表要根据选中的分组显示,并显示分组的名字和条数。

2、处理
思考了下,下拉框数据应该设计成枚举类,分组筛选应是要把选中的字段作为参数送到查询语句中,在配合group by语句,查出对应得分组情况。好,先来一个我第一次写的sql:
select count(defectCode) as groupNum,#{groupName} as groupName
from bugbasefields
GROUP BY #{groupName} 但是查询结果却不是我想要的:

我去这是什么情况,分组和查询结果都不对。在我一遍遍的尝试无果下,打开了万能的度娘。度娘告诉我:你,回去看看mybatis的#和$的区别,再来找我。于是我又找另一个度娘(打开了另一个页面)仔细看了看mybatis下#和$的区别:
1、#{}将传入的参数当成一个字符串,会给传入的参数加一个双引号;
2、${}将传入的参数直接显示生成在sql中,不会添加引号;
3、#{}能够很大程度上防止sql注入,${}无法防止sql注入;
嗯,那改改吧:
select count(defectCode) as groupNum,${groupName} as groupName
from bugbasefields
GROUP BY ${groupName} 结果:

嗯,数据是对了,但是 分组后有null和空字符串,这要是给前端小姐姐,惹她不高兴,我那帮男同事不会给我好果子吃。。。为了不挨揍,那在处理一下。
select count(defectCode) as groupNum,
CASE
WHEN (${groupName} is not null and ${groupName} != '')
THEN ${groupName}
ELSE '其它'
END as groupName
from bugbasefields GROUP BY groupName 结果:
空的,空字符串的都统统去"其它"里,这多好,前端好我也好,,嘿嘿。
在这里我发现了一个新大陆,可能是我知识的盲点,group by 后面是可以跟别名的。
这个是数据表字段,分组但是有问题 没出现了3个其他。

但我稍微改了下,分组别名就达到了预期结果:

这就说明group by 语句一定是在查询之后才执行的。。。由此看来我的sql之路还很长。。。。。
最后 ,还是那句希望在编程路上热情不减,一起加油!
版权声明:本文为justDoItfl原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。