MySQL使用UNION合并查询报1064错误 单查询单独执行正常
MySQL UNION 合并查询报1064语法错误解决
问题根因
报错的核心原因是UNION/UNION ALL 结构中,不允许在未加括号的单个子SELECT语句后单独写ORDER BY子句。
你原写法中第一个SELECT块末尾直接写了order by name,后面直接接UNION,MySQL解析器会认为这个ORDER BY是属于整个合并查询的,和后续第二个SELECT块的语法结构冲突,因此抛出1064语法错误,这个问题和你用UNION还是UNION ALL没有关系。
额外需要注意的UNION排序规则:
- 即使给子SELECT加括号包裹,内部的ORDER BY如果不搭配LIMIT使用,也会被MySQL优化器直接忽略,不会实际生效
- UNION查询默认只需要在最末尾写一个ORDER BY,即可对全量合并结果排序
- UNION要求所有子SELECT返回的列数、对应位置列的数据类型完全匹配,你这两段查询单独执行正常,这部分是符合要求的,不是报错诱因
修正后的可运行代码
你的需求是先返回按姓名排序的「姓名(职业首字母)」行,再返回按从业人数升序、职业名称升序排列的统计行,可以通过增加辅助排序字段实现分组排序,代码如下:
SELECT line_content FROM ( -- 第一部分:人员信息行,归为排序组1 SELECT CONCAT(`name`, '(', SUBSTRING(occupation,1,1), ')') AS line_content, 1 AS sort_group, `name` AS sort_1, 0 AS sort_2, '' AS sort_3 FROM OCCUPATIONS UNION ALL -- 第二部分:职业统计行,归为排序组2 SELECT CONCAT('There are a total of ', COUNT(Occupation), ' ', LOWER(Occupation), 's.') AS line_content, 2 AS sort_group, NULL AS sort_1, COUNT(Occupation) AS sort_2, Occupation AS sort_3 FROM OCCUPATIONS GROUP BY Occupation ) temp -- 全局排序:先排人员信息组(按姓名升序),再排统计组(按人数、职业名升序) ORDER BY sort_group ASC, sort_1 ASC, sort_2 ASC, sort_3 ASC;
其他可选写法
如果你不需要严格保证第一部分所有行排在第二部分前面,只是想让两段结果各自按规则排序,也可以给两个子查询分别加括号包裹,但注意这种写法下子查询内的ORDER BY需要搭配LIMIT(LIMIT数量大于表实际行数即可),否则排序不生效:
(SELECT CONCAT(`name`,'(',substring(occupation,1,1),')') FROM OCCUPATIONS ORDER BY name LIMIT 10000) -- 数值设为大于OCCUPATIONS表总行数即可 UNION ALL (SELECT CONCAT('There are a total of ',count(Occupation),' ',lower(Occupation),'s.') FROM OCCUPATIONS GROUP BY Occupation ORDER BY count(Occupation),Occupation asc LIMIT 10000);
这种写法不依赖全局排序,但是需要提前知道表的最大行数,灵活性不如前面的全局排序写法。
内容的提问来源于stack exchange,提问作者user269867
相关产品推荐
相关产品推荐

