2

ColdFusion 10 を使用しています。

変更できないクエリがあります。SQL を変更できません。クエリは、ajax を含むいくつかの場所から呼び出されています。結果セットから出力されるものだけに触れることができます。

現在の結果セットで新製品の順序をランダム化する必要があります。新製品は常に最初にリストされます。一度に最大50個の製品を出力します。50もの新製品が存在する可能性があります。したがって、結果セットが 100 万行のように巨大になることはありません。

私の現在の結果セットが次のようになっているとしましょう。

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 を使用して結果セットの順序を操作する方法はありますか?

4

2 に答える 2

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>

元のクエリに order by 句が含まれていた場合は、sortby で並べ替えた後に q3 に追加します。

于 2013-06-03T21:40:39.173 に答える