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 来操纵结果集的顺序?

4

2 回答 2

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>
于 2013-06-03T21:48:16.260 回答
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 子句,则在 order by sortby 后将其添加到 q3。

于 2013-06-03T21:40:39.173 回答