MySQL选择重复的列

时间:2012-12-22 19:18:28

标签: mysql coldfusion

我在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。

4 个答案:

答案 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总是使用字母顺序。要获得原始订单

  1. 使用getMetaData(query)。它返回一个包含查询列属性的结构数组,包括name
  2. 或者,您可以使用未记录的 query.getColumnList()方法。它返回一个列名称数组(仅)。
  3. 然后只需使用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