我们有一个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”时,它可以正常工作。
想法?
答案 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
。