查询多个订单的CF查询按语句添加最后排序的列进行选择

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询多个订单的CF查询按语句添加最后排序的列进行选择相关的知识,希望对你有一定的参考价值。

我发现了ColdFusion的query组件的一些非常奇怪的行为。当您使用此组件构建另一个ColdFusion查询的查询(QoQ)查询并在几个列上使用order by时,order by列表中的最后一列将添加到所选输出中。这似乎发生在CF9,10,11和2016,但不是Lucee。

/* Create an unsorted CF-query */
unsorted = QueryNew("col1,col2,col3,col4","VarChar,VarChar,Integer,VarChar");
for (a=10;a gte 1;a--){
    QueryAddRow(unsorted);
    QuerySetCell(unsorted,"col1","col1 #a#");
    QuerySetCell(unsorted,"col2","col2 #a#");
    QuerySetCell(unsorted,"col3","#a#");
    QuerySetCell(unsorted,"col4","col4 #a#");
}

writeDump(var="#unsorted#");

/* Create a new CF query of query with the unsorted table */ 
sorted = new query(
    dbtype = "query"
    ,unsorted = unsorted
    ,sql = "select [col1],[col2] from unsorted order by [col3], [col4] asc"
    ).execute().getresult();

/* The last column in the order by list will be displayed in the result */  
writeDump(var="#sorted#", label="sorted");  

Try this on trycf.com这是上次查询的结果:

    col1        col2        col4
1   col1 1      col2 1      1
2   col1 2      col2 2      2
3   col1 3      col2 3      3
4   col1 4      col2 4      4
5   col1 5      col2 5      5
6   col1 6      col2 6      6
7   col1 7      col2 7      7
8   col1 8      col2 8      8
9   col1 9      col2 9      9
10  col1 10     col2 10     10

这是Adobe CF的已知错误吗?

有没有人知道ColdFusion QoQ中多列的不同,更好的订购方式?

答案

好吧,我报告了Adobe的错误:https://tracker.adobe.com/#/view/CF-4200408并决定通过使用两个QoQ解决错误,分离数据的顺序和选择列,如下所示:

/* Create an unsorted CF-query */
unsorted = QueryNew("col1,col2,col3,col4","VarChar,VarChar,Integer,VarChar");
for (a=10;a gte 1;a--){
    QueryAddRow(unsorted);
    QuerySetCell(unsorted,"col1","col1 #a#");
    QuerySetCell(unsorted,"col2","col2 #a#");
    QuerySetCell(unsorted,"col3","#a#");
    QuerySetCell(unsorted,"col4","col4 #a#");
}

writeDump(var="#unsorted#");

/* Create a new CF query of query with the unsorted table */ 
sorted = new query(
    dbtype = "query"
    ,unsorted = unsorted
    ,sql = "select [col1],[col2] from unsorted order by [col3], [col4] asc"
    ).execute().getresult();

/* The last column in the order by list will be displayed in the result */  
writeDump(var="#sorted#", label="sorted");  

selected = new query(
    dbtype = "query"
    ,sorted = sorted
    ,sql = "select [col1],[col2] from sorted"
    ).execute().getresult();

当然,你会受到很大的打击。在Adobe自己修复bug之前,可能还有其他解决方案。例如,我发现Ben Nadel的这个ancient comment演示了在哪里可以找到cfquery自定义标签的代码,并且认为如果有人这么倾向可以编辑这段代码。

以上是关于查询多个订单的CF查询按语句添加最后排序的列进行选择的主要内容,如果未能解决你的问题,请参考以下文章

sql语句时间排序 sql语句按照时间排序

mysql 查询符合条件的 最后一条

MySQL ORDER BY:对查询结果进行排序

使用二级排序对 linq 查询进行排序 [重复]

sql ORDER BY 多个字段,排序变慢几十倍,求解?

按优化排序复杂选择查询