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之路還很長。。。。。
最後 ,還是那句希望在編程路上熱情不減,一起加油!