当前位置: 首页 > 面试题库 >

MySQL查询错误1054

苏麒
2023-03-14
问题内容

我有这个 MySQL 查询

SELECT count( * ) AS total
FROM `orders` o, `orders_status` s, `orders_status_history` osh
LEFT JOIN `orders_total` ot ON ot.orders_id = o.orders_id
WHERE o.orders_status = s.orders_status_id
AND osh.orders_id = o.orders_id
AND s.language_id = '5'
AND s.orders_status_id = '6'
AND ot.class = 'ot_total'

得到这个错误:

#1054 - Unknown column 'o.orders_id' in 'on clause'

我的表架构如下:

CREATE TABLE IF NOT EXISTS `orders` (
  `orders_id` int(11) NOT NULL auto_increment,
  `customers_id` int(11) NOT NULL default '0',
  `last_modified` datetime default NULL,
  `orders_status` int(5) NOT NULL default '0',
  `orders_date_finished` datetime default NULL,
  `comments` text,
  `currency` char(3) default NULL,
  `currency_value` decimal(14,6) default NULL,
  `invoice_number` varchar(100) default NULL,
  PRIMARY KEY  (`orders_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8419 ;

而且我不明白错误是从哪里来的。有任何想法吗?


问题答案:

如手册中所述:

以前,逗号运算符(,)和JOIN都具有相同的优先级,因此join表达式t1, t2 JOIN t3被解释为((t1, t2) JOIN t3)。现在JOIN具有更高的优先级,因此该表达式被解释为(t1, (t2 JOIN t3))。此更改会影响使用ON子句的语句,因为该子句只能引用联接操作数中的列,并且优先级的更改会更改对这些操作数的解释。

例子:

CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);
INSERT INTO t1 VALUES(1,1);
INSERT INTO t2 VALUES(1,1);
INSERT INTO t3 VALUES(1,1);
SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

以前,SELECT由于t1,t2as的隐式分组,所以合法(t1,t2)。现在JOIN优先,所以ON子句的操作数是t2t3。因为t1.i1这两个操作数都不是列,所以结果是Unknown column 't1.i1' in 'on clause'错误。要允许处理连接,请使用括号将前两个表显式分组,以便该ON子句的操作数为(t1,t2)t3

SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);

另外,请避免使用逗号运算符,而应使用JOIN

SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

这种变化也适用于与混合逗号操作语句INNER JOINCROSS JOINLEFT JOIN,并且RIGHT JOIN,所有这些现在已经比逗号html" target="_blank">运算符优先级越高。



 类似资料:
  • 问题内容: 我有一个数据库表看起来像这样 当我运行此查询时,应该不显示任何行,因为不存在具有value的行: SELECT * FROM tableName WHERE ID =‘101foo2’ 我得到的结果具有相同的ID,但没有单词 如果我的查询是如何显示具有ID的行 问题答案: 您正在混合类型。 是一个整数(或数字)。您正在将其与字符串进行比较。因此,MySQL需要确定用于比较的类型。使用什

  • 问题内容: 我正在使用VB.NET和MySQL在MVC2中进行开发,尝试将简单的SQL查询转换为LINQ时遇到问题。 SQL查询: LINQ查询: 生成的错误是: 执行命令定义时发生错误。有关详细信息,请参见内部异常。 内部异常是: “字段列表”中的未知列“ GroupBy1.K1” 这是LINQ生成的SQL: 查看该查询,很容易找出导致错误的原因。简而言之,最内部的查询仅返回2列,而其上方的查询

  • 当“事件ID”与“用户ID”匹配时,im会尝试从我的“事件”表中选择所有数据。然而,我得到一个错误1242,子查询返回超过1行。 我理解我的子查询将返回多行,因为一个用户可以参加多个事件。那么我如何使我的查询接受多行呢?

  • 尝试编写并执行MySQL查询,以显示所有成本低于50美元的动作或喜剧电影的电影编号、电影标题、电影成本和电影类型。按流派按升序对结果进行排序。

  • 问题内容: 我在表中输入了错误的更新查询。 我忘记在子句中创建一个id字段。 这样就更新了我所有的行。 如何恢复呢? 我没有备份…。 问题答案: 抱歉,恢复被覆盖的MySQL数据库的机会通常接近零。与删除文件不同,在大多数情况下,覆盖记录实际上会物理覆盖现有数据。 为了准备好发生任何事情,您应该停止MySQL服务器,并复制包含数据库的物理目录,这样就不会进一步覆盖任何内容:只需将数据文件夹简单地复

  • 问题内容: 我在选择要使用的子查询上遇到问题。我正在尝试以下操作: 具有主键的表名在哪里?并且类型为INT。执行此操作时,出现以下错误: 问题答案: 从这篇网络文章 发生此错误的原因是,当您在内部选择中还使用同一表作为更新条件时,MySQL不允许对表进行更新。本文继续提供一种解决方案,即使用临时表。 使用此示例,您的更新应为: