如何随机化部分结果集的顺序?

时间:2013-06-03 21:17:28

标签: sql coldfusion coldfusion-10

我正在使用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操作结果集的顺序?

2 个答案:

答案 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。