MySQL联合查询/左连接 - 按错误排序?

时间:2009-09-03 13:52:41

标签: union sql-order-by

我们有一个Union Query。这是一个基本(类似)的例子:

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 个答案:

答案 0 :(得分: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使用临时表进行排序操作。

答案 1 :(得分:3)

MySQL文档(12.2.8.3 UNION 语法)中描述了此问题。您不能使用原始表名,因此请为每列添加别名,并在 ORDER BY 子句中使用此别名:

要使用 ORDER BY LIMIT 子句对整个 UNION 结果进行排序或限制,请将个别 SELECT 语句并将 ORDER BY LIMIT 放在最后一个之后。以下示例使用两个子句:

(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 中的别名。

答案 2 :(得分: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;

阅读括号

答案 3 :(得分:0)

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