問題背景:
在做APP的嵌入頁面的時候,部長給提了這麼一個需求,需要從生產信息的視圖中查詢出每種產品中已經成熟的一條信息,爲了更好的顯示效果。簡單的說,就是黃瓜和茄子分別被種植在1號大棚和2號大棚裏,這樣就會產生4條種植信息,我們想要的結果是按照產品名稱檢索每個產品名稱下的任意一條種植信息即可。比如,黃瓜的種植信息有兩條,隨便拿出來一條,茄子亦如此,那麼我們想要的結果就是兩條(不指定是哪兩條,隨意)。
問題分析:
剛開始我想到的辦法是,通過編寫SQL語句實現,於是就在SQL Server中開始試驗
首先將所有符合情況的記錄查詢出來
<span style="font-size:18px;"> select * from dbo.sn_plant_product_view where catename ='加工類' andnowplant =0 and harveststate =1</span>
然後再使用group by子句將不重複的產品名稱查詢出來,
<span style="font-size:18px;">select pdtname from dbo.sn_plant_product_view where catename='加工類' and nowplant =0 and harveststate =1 group by pdtname</span>
最後在進行組合查詢的時候,發現使用拼接SQL語句的方式行不通,無論我怎樣寫,返回的都是全部的結果,原因是什麼呢?原因就是group by只能將數據進行分組操作,但是無法完成在每組中取一條記錄的操作,換句話說,使用SQL語句,只能進行分組操作,不能爲你完成在每一組數據中任取一條記錄的工作。當然我們可以對group by分組結果進行統計和計算,比如統計每組數據的條數等等。
至於我想要的效果只能通過寫算法實現了,於是開始思考如何寫程序來實現。其實只要對上述的兩個結果進行比較篩選,即可得到想要的結果。
問題解決:
經過簡單的分析,之後,便將方法寫完了,測試了一下可以解決問題,代碼如下:
public List<SnPlantProductView> listForApp(String catename){
//1.首先將結果集中不重複的產品名稱查詢出來
String hql ="select pdtname from SnPlantProductView where catename= ? and nowplant=0 and harveststate=1 group by pdtname";
List<String> listName=super.listByHql(hql, catename);
//2.將符合查詢條件的所有記錄查詢出來
Finder finder = Finder.create("from SnPlantProductView ");
finder.append(" where catename =:catename and nowplant=0 and harveststate = 1");
finder.setParam("catename", catename);
List<SnPlantProductView> list = listByFinder(finder);
//3.聲明一個實體LIst集合變量,用於存放不重複的結果記錄
List<SnPlantProductView> resultList=new ArrayList<SnPlantProductView>();
//4.使用兩重for循環將結果集中任意一條匹配listName集合中的名稱的記錄拿出來,放入resultList集合中
for(int i=0;i< listName.size();i++){
for(int j=0;j<list.size();j++){
/*
* 只要list集合中有記錄的產品名稱和listName集合中的名稱匹配,
* 就將這條記錄放入resultList中,並且跳出當前循環,取下一個名稱進行匹配
* 直到遍歷所有的名稱,這時候,resultList中的記錄數和listName中的記錄數
* 是一樣的,這樣就達到了去重複的目的
*/
if(listName.get(i).equals(list.get(j).getPdtname())){
resultList.add(list.get(j));
break;
}
}
}
return resultList;
}
小結一下:
其實我的辦法還是有缺陷的,如果數據量非常的大,會出現性能瓶頸,兩重For循環,在大數據量的情況下,會消耗很長的時間,進行匹配,最終才能返回結果,速度上就會大打折扣。我知道還有其他的辦法,只是我還想不出來,如果大神們有什麼更好的解決方案,請不吝賜教。