我正在使用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 :(得分:4)
我现在远离CF的副本,但这里的实施与Dan的解决方案略有不同,应该有效,但目前尚未经过测试。
<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>
答案 1 :(得分: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。