2012-12-22 79 views
2

我在select語句中選擇了兩次列State和Zip3兩次,明確指出我想查看的內容。當我在本地的MySQL做到這一點,我得到正確的結果: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 | 
+-------+------+-----------+-------------+-------+------+ 

當我做在冷聚變,我得到一個錯誤的結果:

<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

首先,MySQL不允許在表結構中使用這些類型的重複列,是嗎? –

+2

@PraveenKumar表結構中沒有重複的列。這裏顯示的是「SELECT」查詢的結果。 – Jocelyn

回答

-2

不知道你爲什麼兩次調用它,但這裏是我會怎麼做:

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

如果真正拉鍊在表中兩次顯示了,你要確保它們匹配

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

不知道你在做什麼,但是那個查詢不會做你正在想的事。使用'WHERE zip = zip'表示查找zip值*等於它自己*的所有記錄。它永遠是真實的(除了null值) – Leigh

6

嘗試給列別名

select 
    State, 
    Zip3, 
    FirstName, 
    LastName, 
    State AS State_2, 
    Zip3 as Zip3_2 
from 
    Person 
where 
    State >= 'A' 
order by 
    State, 
    Zip3 
+1

是的,你需要一個別名,所以所有的查詢列名都是唯一的。否則當你使用#Zip3時,CF將不知道你想要哪一列# – Leigh

+5

另外'#columnlist#'按字母順序返回列名。要獲取原始順序,請使用'getMetaData(query)'。它返回一個包含列屬性的結構數組。或者,您可以使用未公開的'yourQueryName.getColumnList()'方法。它返回一個字符串數組(僅)。 – Leigh

+0

嗨,夥計們,我嘗試別名的事情,沒有工作。但確實解決了這個問題,這是我循環的變量列表。列表總是按字母順序排列。爲了保留請求的順序,我使用了,然後通過trulist循環。這工作完美。儘可能難以想象,有時候有很好的理由要求兩次現場。 –

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> 

請注意,我沒有真正測試此代碼。可能有一個或兩個語法錯誤,但邏輯很好。

+0

看到我的評論以上 - B. –

2

我確實嘗試了別名的東西,沒有工作。但是的確解決了這個問題, 這是我正在循環的變量列表。

維護列順序

那麼你實際上並沒有描述什麼是錯在你原來的問題輸出;)然而,正如我在評論中所提到的,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> 

有需要現場兩次

唯一的查詢列名

老實說,有時很好的理由,我想不出有許多很好的理由來回報相同的列多次。正如丹指出的,你可以很容易地輸出它多次。所以我很好奇你的用例。

在結果中多次返回相同列名稱有問題,因爲它不明確。所以當你引用它時,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」列中的值將被丟棄。這就是爲什麼你應該總是使用別名來確保查詢列名是唯一的。

當然,這是假設它甚至在其他版本的作品。我依稀記得有些版本在遇到重複列名時拋出錯誤。但由於這不是我通常所做的事情,所以我將不得不運行測試來驗證它。

+0

你是對的,我已經發現問題是按字母順序排列的列表。由於我只提到queryname [col] [currentrow]而不是列名,所以它是明確的。重新選擇相同的字段兩次,它是在用戶服務中,他們可以選擇他們想要在他們的報告中看到的列,以及如何對它們進行排序。如果他們選擇一個列來查看和排序,那麼它會變成兩次。他們可能沒有達到這個結果,但我不想給他們一個錯誤。我非常偶爾 - 每10年一次? - 需要重複列的報告。 –

+0

我最近做了一個這樣的報告,我看到沒有必要選擇一個列兩次,只是因爲用戶想按它排序。另一方面,我設置了表單,以便用戶只能按照他們將要看到的字段排序。如果你想知道如何做到這一點,請提出另一個問題,因爲它確實是一個不同的話題。 –

+0

@BettyMock - 不完全。代碼* does *引用列名即'queryName [columnName] [currentRow]'。但這不是問題所在。歧義問題早在那之前就發生了。當CF *創建查詢對象時,從數據庫結果中,它遇到兩列聲稱爲「zip3」的值。它只能選擇一個,所以它使用第一個,即「1,8」,並丟棄第二個,即「2,16」。再次,這在這個特定情況下不是問題。但肯定會成爲其他人的問題。 (續) – Leigh