Coldfusion:QueryOfQueries或添加QueryColumn以根据数据库查询及其计算值显示结果

时间:2014-10-16 11:37:24

标签: mysql coldfusion

我进行了广泛的搜索,但无法找到适用于我的任务的内容 - 完全清楚它可能是我的搜索条件而不是导致结果,所以我很感激任何指示方向正确。

Application Server:Coldfusion Application Server 10 Enterprise(U13) 数据库:mySQL 5社区版

任务:根据用户输入显示合适机器的列表。

用户输入计算的某些参数,然后从mySQL数据库中检索。这是第1步,工作正常:

<cfquery name="qmodells" datasource="dproducts">
SELECT idproduct,mymodell,kw1,mymodellprice
FROM myproducts 
WHERE kw1 > <cfqueryparam value="#session.something1.something2.calculatedvalueC1#"/>
AND kw2 > <cfqueryparam value="#session.something1.something2.calculatedvalueC2#"/>
ORDER BY mymodellprice ASC

检索这些值后,我可以计算机器运行时间&#34;那些机器(下面简化的公式)。如果计算的运行时间在一到三个小时之间,我会显示结果。但要这样做,我需要数据库查询中的值:

<table class="table table-condensed"> <cfoutput query="qmodells"> <cfset machineruntime = "#2*(qmodells.kw1/(qmodells.kw2/konstantK3))^konstantK4/24#"> <cfif #TimeFormat(machineruntime, "HH:mm")# GT "01:00" AND #TimeFormat(machineruntime, "HH:mm")# LT "03:30"> <tr> <td nowrap="">#qmodells.mymodell#</td> <td nowrap="">#qmodells.kw1#</td> <td nowrap="">#qmodells.machineruntime#</td> </tr>
</cfif> </cfoutput> </table>

我的目标是只显示运行时间超过一小时的第一台匹配计算机,也可能显示接下来的两个结果。我显然可以将CSS隐藏到这些结果之外的任何行中,但是如何正确地执行此操作呢?

我应该重新填充查询然后输出它,还是有一种聪明的方法来迭代结果并更优雅地执行此操作?我在第一个查询中计算的所有尝试都给了我所有机器的相同运行时间,显然我做错了。

我在查询的SELECT部分​​中思考/尝试这样的事情:

#2*(qmodells.kw1/(qmodells.kw2/konstantK3))^konstantK4/24# AS machineruntime

并且还使用查询作为第二个查询的基础,如下所示:

<cfquery name="topmatch" dbtype="query">
SELECT *
FROM qmodells
WHERE machineruntime > 0.0416666666667

感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

上面使用 qmodells.kw2 的计算尝试将获取查询的唯一第一行,因为它不在循环中。这是我对你想要做的事情的猜测。

首先运行你的qModells查询,但是让我们添加一行作为占位符:

<Cfquery ...>
SELECT idproduct,mymodell,kw1,kw2,mymodellprice, 0.0 AS machineruntime
FROM myproducts 
WHERE kw1 > <cfqueryparam value="#session.something1.something2.calculatedvalueC1#"/>
AND kw2 > <cfqueryparam value="#session.something1.something2.calculatedvalueC2#"/>
ORDER BY mymodellprice ASC
</cfquery>

注意我也将kw2添加到列列表中,因为我没有看到它来自哪里 - 但它在逻辑上似乎是查询的一部分(因为k1在列列表中)。

接下来循环查询,计算并设置机器运行时间。

<cfloop query="#qmodels#">

    <cfset mymachineruntime = 2*(kw1/(kw2/konstantK3))^konstantK4/24 />
    <cfset querysetcell(qmodels,'machineruntime',mymachineruntime,currentrow)/>
</cfloop>

最后,使用q的q,选择与您要查找的值匹配的记录:

<cfquery name="topmatch" dbtype="query">
SELECT *
FROM qmodells
WHERE machineruntime > 0.0416666666667
</cfquery>

认为接近你在上面尝试的内容。你只需要一个循环。


注意 - 这可能是查询中存储过程或一些聪明的数据库代码的好地方。 DB可能能够生成此值并直接为您返回。希望这有帮助!


编辑注意:正如Dan指出,当您尝试通过Q的Q进行选择时,空字符串可能会导致问题(这可能会导致AlphaNum选择而不仅仅是Num选择)。所以我更改了查询以使用数字(0)。

答案 1 :(得分:0)

我通常会像这样处理这种情况:

<cfquery name="q1" dsn="somedatabase">
select field1, field2, 10.12314 MachineRunTime
etc
</cfquery>

然后遍历查询并计算每行的MachineRunTime。现在,您可以使用order by子句和maxrows属性查询查询,以获取要显示的内容。

答案 2 :(得分:0)

正如Leigh所说,您可以直接在查询中执行此操作吗?

select model,modelprice,kw1,kw2,
  (2 * (kw1 / (kw2/#val(konstantK3)#))^#val(konstantK4)#/24) as MachineRunTime
  from MyProducts
 WHERE kw1 > <cfqueryparam value="#session.something1.something2.calculatedvalueC1#"/>
   AND kw2 > <cfqueryparam value="#session.something1.something2.calculatedvalueC2#"/>

我使用非常随机的样本数据制作了basic demonstration sqlfiddle

如果您拥有基本查询数据和QoQ数据并不重要,您可以附加此数据并修改QoQ。

AND (2 * (kw1 / (kw2/#val(konstantK3)#))^#val(konstantK4)#/24) > 0.0416666666667

因为我们正在使用数字作为变量输入,除了已放置的cfqueryparams OP之外,我只是使用#val()#函数将任何非数字转换为0. OP,你可以做在查询之外进行一些错误检查,并说出<cfif val(konstantk3) gt 0 and val(konstantk4) eq 0>...execute the code....</cfif>