4

我们有一个联合查询。这是一个基本(类似)示例:

SELECT a.Name, b.Info
FROM a 
LEFT JOIN b ON (a.ID = b.ID) 
WHERE a.Name LIKE "a%"
UNION
SELECT a.Name, b.Info 
FROM a
LEFT JOIN b ON (a.ID = b.ID)
WHERE a.Name LIKE "b%"
ORDER BY a.Name, b.Info;

我收到一条错误消息,上面写着“‘订单子句’中的未知列‘b.Info’”。

当我从 ORDER BY 子句末尾删除“b.Info”时,它可以工作。

想法?

4

4 回答 4

3

在联合发生之后,Orderby 将应用于组合结果集。此时,可以说只有一张表,因此对 b.Info 的引用将无效。

SELECT a.Name AS 'NameCol', b.Info AS 'InfoCol' FROM a LEFT JOIN b ON (a.ID = b.ID) WHERE 
a.Name LIKE "a%" UNION SELECT a.Name AS 'Name', b.Info AS 'Info' FROM a LEFT JOIN b ON
(a.ID = b.ID) WHERE a.Name LIKE "b%" ORDER BY NameCol, InfoCol;

请注意,这可能会非常慢(对于大型结果集),因为您正在强制 MySQL 使用临时表进行排序操作。

于 2009-09-03T13:57:14.200 回答
3

MySQL 文档(12.2.8.3 UNION Syntax)中描述了这个问题。您不能使用原始表名,所以给每一列一个别名并在ORDER BY子句中使用这个别名:

要使用ORDER BYLIMIT子句对整个UNION结果进行排序或限制,请将各个SELECT语句括起来并将ORDER BYLIMIT放在最后一个之后。以下示例同时使用了这两个子句:

(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

这种ORDER BY不能使用包含表名(即 tbl_name.col_name 格式的名称)的列引用。相反,在第一个SELECT语句中提供一个列别名并引用ORDER BY中的别名。

于 2009-09-03T14:04:23.437 回答
1

你为什么要使用联合?此查询相同且更快:

SELECT a.Name, b.Info FROM a LEFT JOIN b ON a.ID = b.ID
WHERE (a.Name LIKE "a%" OR a.Name LIKE "b%") ORDER BY a.Name, b.Info;

读括号

于 2011-05-13T05:28:08.603 回答
0

我认为当您进行查询时,您应该在子句UNION中指定列位置,而不是名称。ORDER BY试试ORDER BY 1,2

于 2009-09-03T13:56:23.653 回答