2013-06-03 71 views
2

我正在使用ColdFusion 10.如何隨機化結果集的部分順序?

我有一個查詢,我無法更改。我無法更改SQL。查詢從幾個地方被調用,包括ajax。我只能觸摸結果集輸出的內容。

我需要隨機化當前結果集中新產品的順序。新產品將永遠列在第一位。我將一次輸出最多50個產品。可以有多達50個新產品。所以,結果集永遠不會很大,就像一百萬行。

讓我們只想說,我現在的結果集是這樣的:

ProductID, IsNew 
1   T 
2   T 
3   T 
4   F 
5   F 
6   F 

我的目標是隨機的新產品,讓老產品在其現有的順序。所以,我的新的結果集可能是這樣的:

ProductID, IsNew 
3   T 
1   T 
2   T 
4   F 
5   F 
6   F 

我的想法是遍歷結果,發現新產品(這將永遠被列在第一位),將它們添加到列表,隨機列表,然後以某種方式操縱結果集以使用隨機列表。有點像這樣:

// create empty list 
NewProductsList = ""; 
// loop through results and add new products to list 
NewProductsList = "1,2,3"; 
// randomize list of new products 
NewProductsList = "3,1,2"; 

我的想法是使用queryAddRow()和querySetCell()函數來改寫結果。有沒有辦法在輸出時使用ColdFusion處理結果集的順序?

+0

您是否試過http://www.cflib.org/index.cfm?event=page.udfbyid&udfid=524?使用currentrow + 1 – Henry

回答

4

我從CF副本掉的權利,但這裏有一個稍微不同的實現丹的解決方案,它應該工作,但目前沒有進行測試。

<cfset QueryAddColumn(myQuery,"sortCol","Decimal")> 
<cfloop query="myQuery"> 
    <cfif myQuery.IsNew> 
     <cfset myQuery.sortCol = Rand()> <!--- will be 0-1 ---> 
    <cfelse> 
     <cfset myQuery.sortCol= myQuery.CurrentRow+1> <!--- will always be 2 or greater ---> 
    </cfif> 
</cfloop> 

<cfquery name="sorted" dbtype="query"> 
select * from myQuery order by sortCol 
</cfquery> 
+0

聰明想法。 –

2

我會使用查詢查詢。第1步是:

<cfquery name = "q2" dbtype="query"> 
select productid, otherfields, 1000 sortby 
from OriginalQuery 
where IsNew = 'T' 
</cfquery> 

第2步 - 隨機的sortby場

<cfloop query="q2"> 
<cfset QuerySetCell(q2, "sortby", RandRange(0,1000), currentrow)> 
</cfloop> 

第3步 - 把它放在一起

<cfquery name="final" dbtype="query"> 
select productid, otherfields, 0 sortby 
from OriginalQuery 
where IsNew = 'F' 
union all 
select productid, otherfields, sortby 
from q2 
order by sortby desc 
</cfquery> 

如果原始查詢by子句有一個順序,在排序後按q3添加到q3。