使用UNION ALL联合查询遇#1064语法错误,求SQL修正方案
修正后的SQL语法及问题说明
错误原因分析
- 语法错误:UNION ALL右侧的子查询不需要添加别名
as table2,这是直接触发#1064报错的原因。 - 列数不匹配:UNION ALL要求左右两个查询返回的列数必须完全一致,且对应列的数据类型需兼容。你的第一个子查询返回2列(
ID、url),第二个返回4列(ID、post_title、post_content、post_date),列数不匹配,即使修复语法后仍会报错。
修正方案示例
根据你的需求,这里提供两种常见的修正方式:
方案1:统一为4列结构(用NULL填充缺失列)
如果需要保留第二个查询的4列字段,给第一个查询补充对应空列:
SELECT ID, url, NULL AS post_content, NULL AS post_date FROM ( SELECT company_id AS ID, CONCAT('https://example.com/axy/', `slug`) AS url FROM company22 c WHERE company_name LIKE '%xyz%' AND c.is_active = 1 AND admin_approved = 1 ORDER BY company_id DESC LIMIT 0, 1 ) AS table1 UNION ALL SELECT ID, post_title, post_content, post_date FROM `wp_posts` WHERE post_content LIKE '%xyz%' AND post_status = 'publish' AND post_type='table' ORDER BY post_date DESC;
方案2:统一为2列结构(调整第二个查询的返回列)
如果只需要两列数据,调整第二个查询仅返回对应字段:
SELECT ID, url FROM ( SELECT company_id AS ID, CONCAT('https://example.com/axy/', `slug`) AS url FROM company22 c WHERE company_name LIKE '%xyz%' AND c.is_active = 1 AND admin_approved = 1 ORDER BY company_id DESC LIMIT 0, 1 ) AS table1 UNION ALL SELECT ID, post_title AS url FROM `wp_posts` WHERE post_content LIKE '%xyz%' AND post_status = 'publish' AND post_type='table' ORDER BY ID DESC;
关键注意事项
- UNION ALL仅要求左右查询的列数、数据类型兼容,列名可以不一致(最终结果列名以左侧查询为准)。
- 若需对联合后的整体结果排序,将
ORDER BY放在语句末尾;若要单独对子查询排序,必须配合LIMIT(否则MySQL会忽略子查询内的ORDER BY)。
内容的提问来源于stack exchange,提问作者Naren Verma
相关产品推荐
相关产品推荐

