我有这个 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子句的操作数是t2和t3。因为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 JOIN,CROSS JOIN,LEFT JOIN,并且RIGHT JOIN,所有这些现在已经比逗号运算符优先级越高。
以前,逗号运算符(,)和JOIN都具有相同的优先级,因此join表达式t1, t2 JOIN t3被解释为((t1, t2) JOIN t3)。现在JOIN具有更高的优先级,因此该表达式被解释为(t1, (t2 JOIN t3))。此更改会影响使用ON子句的语句,因为该子句只能引用联接操作数中的列,并且优先级的更改会更改对这些操作数的解释。
,
JOIN
t1, t2 JOIN t3
((t1, t2) JOIN t3)
(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子句的操作数是t2和t3。因为t1.i1这两个操作数都不是列,所以结果是Unknown column 't1.i1' in 'on clause'错误。要允许处理连接,请使用括号将前两个表显式分组,以便该ON子句的操作数为(t1,t2)和t3:
SELECT
t1,t2
(t1,t2)
t2
t3
t1.i1
Unknown column 't1.i1' in 'on clause'
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 JOIN,CROSS JOIN,LEFT JOIN,并且RIGHT JOIN,所有这些现在已经比逗号运算符优先级越高。
INNER JOIN
CROSS JOIN
LEFT JOIN
RIGHT JOIN