2016-02-12 104 views
2

我越來越沮喪,因爲我不明白爲什麼在我的SELECT和UNION中我缺少一些字段。 我讀了關於這方面的優秀文檔,並遵循了最常見的示例,避免在第一個和第二個SELECT之間獲得不同數量的列。MySql UNION SELECT缺少字段

它增加了在兩個語句之間添加偶數列的NULL列。

這裏我的情況:

$query = "(SELECT GC.GroupNO AS GroupNO, 
    GC.Name AS Name, 
    GC.Pax AS Pax, 
    GC.Start AS Start, 
    NULL AS custid, 
    NULL AS firstname, 
    NULL AS lastname, 
    NULL AS arrivaldate, 
    NULL AS hour, 
    NULL AS pax, 
    NULL AS cctype, 
    NULL AS created, 
    NULL AS sid, 
    NULL AS ref_source, 
    NULL AS numnights 
    FROM LargeGroupHostels, GroupContacts AS GC 
    WHERE LargeGroupHostels.HostelNumber = %d 
    AND LargeGroupHostels.Status = %s 
    AND LargeGroupHostels.GroupNO = GC.GroupNO"; 
    AND GC.Start < %s 
    ORDER BY LastUpdated DESC LIMIT %d, %d 
    )UNION(
    SELECT 
    NULL AS GroupNO, 
    NULL AS Name, 
    NULL AS Pax, 
    NULL AS Start, 
    `custid`, 
    `firstname`, 
    `lastname`, 
    `arrivaldate`, 
    `hour`, 
    `pax`, 
    `cctype`, 
    `created`, 
    `sid`, 
    `ref_source`, 
    datediff(departdate, arrivaldate) AS numnights 
    FROM customer_details 
    WHERE hostelnumber = %d 
    AND lastupdated = "" AND status != "CANX" 
    AND booking_type IN ("HOSTEL", "HOSTELPACK") 
    ORDER BY customer_details.arrivaldate, customer_details.created 
    LIMIT %d, %d) 
    '; 
一些的優化和一些變化,我所知道做

除此之外,我的問題在這裏: - 爲什麼我沒有拿到列GC.Name,GC.Pax,GC.Start?如果我反轉這兩個SELECT,它恰好相反,只考慮GC.Name,GC.Pax,GC.Start並避開其他列。

我不太習慣這種查詢,這是我第一次處理這個問題。我敢肯定,我失去了一些東西,但我不明白是什麼

+0

我可能會錯過這裏的東西 - 但爲什麼你使用這個工會? Union用於具有相同數據結構的多個查詢。這看起來像是在單一結果中將旅舍數據與客戶數據結合起來,這可以通過各種連接來完成,並且可能產生更多可讀結果 –

+0

第一個查詢具有'groupno',第二個查詢具有'numnights',而他們不排隊。 –

+0

@KaiQing你有理由,但在這種情況下,記錄將被安排在一個單一的數組,因爲他們有很多共同點,即使名稱可能不同。問題是我得到了一個非常大的數組,我需要對提高性能的結果進行分頁。我曾嘗試使用array_slice進行分頁,但加載記錄的問題當然存在 –

回答

1

您正在嘗試UNION,例如GC.nameName。這些被MySQL解釋爲兩個單獨的列,因爲它無法智能地猜測你的意圖(並且可能不應該具有該能力)。你應該在目前沒有別名,像這樣第一個SELECT語句的別名列名:

SELECT GC.GroupNO AS GroupNO, 
GC.Name AS Name, 
GC.Pax AS Pax, 
GC.Start AS Start, 

在所有其他情況下,你的別名或原始列名的比賽。

我也同意上面的評論之一,這可能更適合某種JOIN。

+0

這是真的,但我也試過這個解決方案,但它不起作用。我按照你的建議更新了原始問題中的查詢 –

+0

@RobertoRizzi那麼你現在得到了什麼結果呢?我沒有看到在列的兩個SELECT語句完全匹配的情況下,你會如何「丟失」列。 –

+0

好吧,var轉儲GroupNO或Pax爲例如我得到NULL,相反var轉儲custid它顯示正確:( –

0

似乎列的位置是不一樣的

$query = "(SELECT GC.GroupNO, 
GC.Name, 
..... 
NULL AS ref_source 
FROM LargeGroupHostels, GroupContacts AS GC 

SELECT 
    NULL AS Name, 

    .... 

    datediff(departdate, arrivaldate) as numnights 
    FROM customer_details 
在firts

選擇第一列中有一列不存在於第二選擇中,第二列中的列末尾不符合firts選擇

+0

感謝您的回覆。我按照你的建議修正了這個查詢,但是它一直沒有記錄GC.GroupNO,GC.Name,GC.Pax,GC.Start' –

+0

你在第一次選擇時有一個連接,但是我沒有看到on子句。 .FROM LargeGroupHostels,GroupContacts AS GC ....是對的..? – scaisEdge

+0

列排序對UNION沒有影響。 –