MySql UNION SELECT 缺少字段
MySql UNION SELECT is missing fields
我越来越沮丧,因为我不明白为什么在使用 UNION 的 SELECT 中我遗漏了一些字段。
我阅读了关于此的很好的文档,我遵循了最常见的示例,避免在第一和第二个之间获得不同数量的列 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
列?如果我反转两个 SELECTs,它恰好相反,只考虑 GC.Name,GC.Pax,GC.Start
并避免其他列。
我对这种查询不是很熟练,这是我第一次处理这种问题。我确定我遗漏了什么,但我不明白是什么
好像列的位置不一样
$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
在第一个 select 中,在第二个 select 中有一个列不存在,而在第二个中,末尾的列与第一个不匹配 select
您正在尝试联合 GC.name
和 Name
。 MySQL 将它们解释为两个单独的列,因为它无法智能地猜测您的意图(并且可能不应该具有这种能力)。您应该在第一个 SELECT 语句中为当前没有别名的列名称设置别名,如下所示:
SELECT GC.GroupNO AS GroupNO,
GC.Name AS Name,
GC.Pax AS Pax,
GC.Start AS Start,
在所有其他情况下,您的别名或原始列名称匹配。
我也同意上面的评论之一,这可能更适合某种 JOIN。
我越来越沮丧,因为我不明白为什么在使用 UNION 的 SELECT 中我遗漏了一些字段。 我阅读了关于此的很好的文档,我遵循了最常见的示例,避免在第一和第二个之间获得不同数量的列 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
列?如果我反转两个 SELECTs,它恰好相反,只考虑 GC.Name,GC.Pax,GC.Start
并避免其他列。
我对这种查询不是很熟练,这是我第一次处理这种问题。我确定我遗漏了什么,但我不明白是什么
好像列的位置不一样
$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
在第一个 select 中,在第二个 select 中有一个列不存在,而在第二个中,末尾的列与第一个不匹配 select
您正在尝试联合 GC.name
和 Name
。 MySQL 将它们解释为两个单独的列,因为它无法智能地猜测您的意图(并且可能不应该具有这种能力)。您应该在第一个 SELECT 语句中为当前没有别名的列名称设置别名,如下所示:
SELECT GC.GroupNO AS GroupNO,
GC.Name AS Name,
GC.Pax AS Pax,
GC.Start AS Start,
在所有其他情况下,您的别名或原始列名称匹配。
我也同意上面的评论之一,这可能更适合某种 JOIN。