2016-02-12 79 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没有影响。 –