2

我在我的选择语句中选择了两次 State 和 Zip3 列,准确地说明了我想看到的内容。当我在本机 MySQL 中执行此操作时,我得到了正确的结果:

SELECT State,Zip3, FirstName, LastName, State, Zip3 
FROM Person
WHERE State >= 'A'
ORDER BY State, Zip3
LIMIT 10;

+-------+------+-----------+-------------+-------+------+
| State | Zip3 | FirstName | LastName    | State | Zip3 |
+-------+------+-----------+-------------+-------+------+
| AB    | T7X  | Adalei    | Starreveld  | AB    | T7X  |
| AK    | 998  | Linda     | Rosenthal   | AK    | 998  |
| AL    | 361  | Benjamin  | Sung        | AL    | 361  |
| AL    | 362  | Lawrence  | Kallus      | AL    | 362  |
| AZ    | 857  | Rose      | Springfield | AZ    | 857  |
| CA    | 941  | Maura     | Cronin      | CA    | 941  |
| CA    | 941  | Dov       | Grunschlag  | CA    | 941  |
| CA    | 943  | Ruth      | Hodos       | CA    | 943  |
| CT    | 055  | Andrew    | Salvo       | CT    | 055  |
| CT    | 064  | DEBORAH   | GRASER      | CT    | 064  |
+-------+------+-----------+-------------+-------+------+

当我在 Cold Fusion 中执行此操作时,我得到了错误的结果:

<cfquery name = "stest" datasource = "Moxart">
select State,Zip3, FirstName,LastName,State,Zip3 from Person
where State >= 'A'
order by State,Zip3
</cfquery>
<cfset j = 0>
<table>
<cfoutput query = "stest">
<tr>
<cfloop index = "col" list = "#columnlist#">
<cfset j = j + 1>
<cfset colname[j] = #stest[col][currentrow]#>
<td>   #colname[j]# </td>
</cfloop><br/>
</tr>
</cfoutput>
</table>


Adalei      Starreveld      AB      AB      T7X     T7X  
Linda       Rosenthal       AK      AK      998     998 
Benjamin    Sung            AL      AL      361     361
Lawrence    Kallas          AL      AL      362     362
Rose        Springfield     AZ      AZ      857     857
Maura       Cronin          CA      CA      941     941
Dov         Grunschlag      CA      CA      941     941
Ruth        Hodos           CA      CA      943     943
Andrew      Salvo           CT      CT      055     055
DEBORAH     GRASER          CT      CT      064     064     

如何从 ColdFusion 中获得正确的结果。我正在使用 ColdFusion 8 和 Firefox。

4

4 回答 4

6

尝试给列一个别名

select 
  State,
  Zip3, 
  FirstName,
  LastName,
  State AS State_2,
  Zip3 as Zip3_2 
from 
  Person
where 
  State >= 'A'
order by 
  State,
  Zip3
于 2012-12-22T19:28:30.760 回答
2

我确实尝试了别名的东西,没有用。但确实解决了问题,这是我循环的变量 columnlist。

维护列顺序

好吧,您实际上并没有描述原始问题中的输出有什么问题;)但是,正如我在评论中提到的,columnList始终使用字母顺序。要获得原始订单

  1. 使用getMetaData(query). 它返回一个包含查询列属性的结构数组,包括name.
  2. 或者,您可以改用未记录 query.getColumnList()的方法。它返回一个列名数组(仅)。

然后只需使用cfloop array. 无需转换为列表,除非您使用的是 MX7 或更早版本(不支持数组循环)。

    <!--- using getMetaData --->
    <cfset colProps = getMetaData(someQuery) />
    <cfoutput query="someQuery">
        <cfloop array="#colProps#" index="col">
            #someQuery[ col.Name ][ currentRow ]# |
        </cfloop>
        <br />
    </cfoutput>

    <!--- using undocumented getColumnList() --->
    <cfset colNames = someQuery.getColumnList() />
    <cfoutput query="someQuery">
        <cfloop array="#colNames#" index="col">
            #someQuery[ col ][ currentRow ]# |
        </cfloop>
        <br />
    </cfoutput>

有时有充分的理由请求一个字段两次

唯一查询列名

老实说,我想不出很多好理由多次返回同一列。正如 Dan 指出的那样,您可以轻松地多次输出它。所以我很好奇你的用例。

在结果中多次返回相同的列名是有问题的,因为它是模棱两可的。所以当你引用它时,CF 不知道你想要哪一列。在您的特定情况下,这并不重要,因为两者的值相同。但是考虑这个数据值不同但相同的列名分配给两者的示例:

<cfquery name="someQuery" datasource="someDSN">
    SELECT  1 AS Zip3, 2 AS Zip3 
    UNION ALL
    SELECT  8 AS Zip3, 16 AS Zip3 
</cfquery>

如果要输出#zip3#,正确的结果应该是什么?如果您实际转储查询,则结果为:

  RESULTSET query 
  Row  | ZIP3 | ZIP3 
  1    | 1    | 1  
  2    | 8    | 8  

因为 CF 不知道要为“Zip3”使用哪些值,所以它显然只是选择了它找到的第一列来解决歧义。第二个“Zip3”列中的值被简单地丢弃。这就是为什么您应该始终使用别名来确保查询列名是唯一的。

当然,这是假设它甚至可以在其他版本中使用。我隐约记得某些版本在遇到重复的列名时会抛出错误。但由于这不是我通常做的事情,我必须运行测试来验证它。

于 2012-12-24T03:42:34.283 回答
0

我建议选择一次,显示两次。像这样的东西:

<cfscript>
Headers = "State,Zip Code,First Name,Last Name,State,Zip Code";
Fields = "state,zip3,FirstName,LastName,State,Zip3";
</cfscript>

<cfquery name = "stest" datasource = "Moxart">
select State, Zip3, FirstName, LastName
from Person
where State >= 'A'
order by State,Zip3
</cfquery>

<table>
<tr>
<cfoutput>
<cfloop index = "thisHeader" List = "#Headers>
<th>#thisHeader#</th>
</cfloop>
<cfoutput>
</tr>
<cfoutput query = "stest">
<tr>
<cfloop list = "#fields#" index = "thisField">
<td>#stest[thisField][currentrow]#</td>
</cfloop>
</tr>
</cfoutput>
</table>

请注意,我实际上并没有测试此代码。可能有一两个语法错误,但逻辑很好。

于 2012-12-22T21:54:26.107 回答
-2

不知道你为什么要调用它两次,但我会这样做:

SELECT state, first_name, last_name zip FROM person WHERE state >= 'a' ORDER BY state, zip

如果真的 zip 在表格中出现两次,并且您想确保它们匹配

SELECT state, first_name, last_name zip FROM person WHERE state >= 'a' AND zip = zip ORDER BY state, zip
于 2012-12-22T19:23:54.993 回答