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之路还很长。。。。。
最后 ,还是那句希望在编程路上热情不减,一起加油!