【问题标题】:Error: The used SELECT statements have a different number of columns, how is fix it?错误:使用的 SELECT 语句的列数不同,如何解决?
【发布时间】:2011-10-18 07:17:56
【问题描述】:

是什么导致了这个错误?怎么解决?

$find = 'hello';
$data = $this->db->query('SELECT * FROM tour_foreign_residence WHERE name LIKE "%' . $find . '%" UNION SELECT * FROM tour_foreign WHERE name LIKE "%' . $find . '%"');

错误:

发生数据库错误
错误号:1222
使用的 SELECT 语句的列数不同
SELECT * FROM tour_foreign_residence WHERE name LIKE "%hello%" UNION SELECT * FROM tour_foreign WHERE name LIKE "%hello%"
文件名: D:\xampp\htdocs\system\database\DB_driver.php
行号:330

【问题讨论】:

  • 不要使用select *,指定你想要的列。 union 不同部分的列必须具有相同的数据类型,并且列数必须相同。如果这无法实现,则需要有两个单独的选择语句。
  • 请在这里阅读我的帖子:stackoverflow.com/questions/7800259/… 应该使用 UNION 还是什么?我的查询怎么样?
  • 如果$find 实际上是任何类型的用户输入,请使用prepared statements,除非您想大搞 SQL 注入地狱。
  • 我有几个数据库,没有一个数据库。
  • @Philipp Reichart - 你的订单是 php.net 中的示例 #6 吗?

标签: php sql codeigniter


【解决方案1】:

使用UNION操作符有两个主要规则:

  1. 联合查询中检索到的列的计数和排序应该相等
  2. 适当列中的数据类型必须兼容

在您的情况下,第一条规则被忽略。 改用join 运算符

【讨论】:

【解决方案2】:

您确定需要UNION吗?

UNION 要求您合并的所有查询在 SELECT 子句中具有相同数量的列,因此您不应使用 *,而应明确编写您需要查询的字段。此外,clumn 需要具有相同的数据类型。

【讨论】:

【解决方案3】:

不要在查询中使用SELECT *。而是记下您希望从数据库中获取的实际列名。两个表中的列名应该相同。您当前有一个UNION,看起来tour_foreign_residencetour_foreign 表有不同的列。

【讨论】:

【解决方案4】:

根据w3schools article about UNION operator

UNION 中的每个 SELECT 语句必须具有相同的 列数。这些列还必须具有相似的数据类型。 此外,每个 SELECT 语句中的列的顺序必须相同。

【讨论】:

猜你喜欢
  • 2015-01-21
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多