← 返回错误码列表

MySQL错误码 1222 分析与解决方案

错误信息

Error 1222

使用的SELECT语句有不同的列数。

在使用UNION操作时,所有SELECT语句必须具有相同数量的列:

'pdo_code' => '21000',
'db_code' => 1222,
'db_error' => 'The used SELECT statements have a different number of columns'

解决方案

  • 检查所有UNION中的SELECT语句列数是否一致
  • 使用NULL或默认值填充缺失的列
  • 确保列的数据类型兼容
  • 检查子查询中的列数
  • 使用别名确保列名一致
  • 分别测试每个SELECT语句

PHP修复示例代码

// 错误的UNION查询(列数不一致)
$wrongQuery = "SELECT id, name FROM users "
                    "UNION "
                    "SELECT id FROM orders"; // 错误:只有1列

// 正确的UNION查询(列数一致)
$correctQuery = "SELECT id, name FROM users "
                        "UNION "
                        "SELECT id, NULL as name FROM orders"; // 正确:使用NULL填充

// 或者使用默认值
$correctQuery2 = "SELECT id, name FROM users "
                        "UNION "
                        "SELECT id, 'N/A' as name FROM orders"; // 正确:使用默认值

UNION操作示例

UNION操作要求所有SELECT语句具有相同的列数:

❌ 错误的UNION

SELECT id, name, email FROM users
UNION
SELECT id, name FROM customers -- 错误:缺少email列

✅ 正确的UNION

SELECT id, name, email FROM users
UNION
SELECT id, name, NULL as email FROM customers -- 正确:使用NULL填充

✅ 另一种正确方式

SELECT id, name, email FROM users
UNION
SELECT id, name, '' as email FROM customers -- 正确:使用空字符串

调试技巧

1. 分别测试每个SELECT

  • 单独运行每个SELECT语句
  • 检查每个查询返回的列数
  • 使用DESCRIBE查看表结构

2. 使用COUNT(*)验证列数

-- 检查每个SELECT的列数
SELECT COUNT(*) as column_count
FROM (
  SELECT id, name, email FROM users
) as t1;

SELECT COUNT(*) as column_count
FROM (
  SELECT id, name FROM customers
) as t2;

3. 数据类型兼容性

  • 确保对应列的数据类型兼容
  • 使用CAST函数转换数据类型
  • 注意NULL值的处理

常见场景

1. 子查询中的UNION

-- 子查询中的列数也必须一致
SELECT * FROM (
  SELECT col1, col2 FROM table1
  UNION
  SELECT col1, col2, col3 FROM table2 -- 错误!
) as subquery;

2. 多表JOIN后的UNION

-- JOIN操作可能改变列数
SELECT t1.col1, t2.col2 FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id
UNION
SELECT col1, col2 FROM table3; -- 需要确保列数匹配

3. 视图中的UNION

-- 创建视图时也要注意列数一致
CREATE VIEW my_view AS
SELECT col1, col2 FROM table1
UNION
SELECT col1, col2 FROM table2;