我在select语句中选择了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。
答案 0 :(得分:6)
尝试为列添加别名
select
State,
Zip3,
FirstName,
LastName,
State AS State_2,
Zip3 as Zip3_2
from
Person
where
State >= 'A'
order by
State,
Zip3
答案 1 :(得分:2)
我确实试过了别名的东西,没用。但确实解决了问题, 这是我循环的变量列表。
维护列顺序
嗯,你实际上没有描述原始问题中输出的错误;)但是,正如我在评论中提到的,columnList
总是使用字母顺序。要获得原始订单
getMetaData(query)
。它返回一个包含查询列属性的结构数组,包括name
。 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”列中的值被简单地丢弃。这就是为什么您应该始终使用别名来确保查询列名称是唯一的。
当然,假设它甚至适用于其他版本。我隐约记得有些版本在遇到重复的列名时抛出错误。但由于这不是我通常做的事情,我必须运行测试来验证它。
答案 2 :(得分: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>
请注意,我实际上并未测试此代码。可能存在一两个语法错误,但逻辑很好。
答案 3 :(得分:-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