【问题标题】:ColdFusion 9 - Top n random query resultsColdFusion 9 - 前 n 个随机查询结果
【发布时间】:2013-05-13 17:22:04
【问题描述】:

我有一系列查询,我随机获得 5 个结果,问题是通过它们需要一段时间,主要是因为它涉及一个循环来分配我可以订购的 rand 值by(Railo 可以在查询中执行)

我想知道是否有人处理过这个问题并知道加速它的方法。

我低于 200 毫秒,这还不错,但我确信可以加快速度。

【问题讨论】:

  • 您不清楚您当前正在使用的流程 - 是否需要使用 QoQ 执行此操作?
  • 它的意思是作为查询的子集,但是如果结果更快,我会接受它

标签: coldfusion coldfusion-9 cfml qoq


【解决方案1】:

您可能根本不需要使用 QoQ。

一种选择可能是将您的原始查询编写为:

SELECT TOP 5 whatever,you,need
FROM table
ORDER BY rand()

根据您使用的数据库服务器更新语法。

另一个可以同时用于常规查询和 QoQ 的选项是:

  1. 只选择主键
  2. 随机排列数组(即createObject("java","java.util.Collections").shuffle(Array)
  3. 使用数组中的前五项来选择您需要的字段。

没有循环或更新,只需两个简单的选择。

当然,如果您的主键只是一个自动递增的整数,您可能会使用SELECT MAX(Id),然后使用RandRange 来选择您的五个项目。

【讨论】:

  • 嘿,谢谢,我完全忘了提及我的数据库类型。我正在使用 MS SQL,因此 top
  • 好的,您可能还需要ORDER BY newid() 用于MS SQL,并且可能this answer 是相关的。
【解决方案2】:

对于 Microsoft SQL Server (v2005+),此查询语法将获得 5 条随机记录:

SELECT TOP 5 *
FROM table
ORDER BY NEWID()

【讨论】:

    【解决方案3】:

    我在 Railo (ColdFusion 9) 上,TOPNEWID() 都不能用于 Query of Query (QoQ)。如果您碰巧遇到了这种用例,并且您必须按照 QoQ 采取行动,那么这里有一个解决方案:

    <cfquery name="randomizedQueryObject" dbtype="query" maxrows="10">
    SELECT *, RAND() as rand
    FROM someQueryObject
    ORDER BY rand
    </cfquery>
    

    这会从更大的结果集中返回 10 个随机项目,并在 QoQ 中工作。简短而简单。

    【讨论】:

    • 它在 QoQ 中不起作用。它说 RAND() 遇到问题
    • 嗯...它对我来说工作正常。也许 RAND() 正在工作,因为我在 Railo 上?不能确定。即使 RAND() 不适合您,请尝试以其他方式生成随机数并将其放入自定义“rand”列中。
    • 是的,Railo 允许这样做,但 ACF 不允许 QoQ :(
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多