2

この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 ;

そして、エラーがどこから来たのか理解できません。何か案は?

4

3 に答える 3

2

orders テーブルのテーブル エイリアスとしてがありORます。テーブルのエイリアス名を変更する必要があります。

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

JOIN 構文も変更する必要があります

SELECT count( * ) AS total
FROM `orders` o 
LEFT JOIN `orders_status` s
    ON o.order_status = s.orders_status_id
LEFT JOIN `orders_status_history` osh
    ON osh.orders_id = o.orders_id  
LEFT JOIN `orders_total` ot 
    ON ot.orders_id = o.orders_id
WHERE s.language_id = '5'
    AND s.orders_status_id = '6'
    AND ot.class = 'ot_total'
于 2012-05-11T18:14:22.990 に答える
2

マニュアルに記載されているように:

以前は、コンマ演算子 ( ,) と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);

以前は、 as が暗黙的にグループ化されていたため、はSELECT正当でした。が優先されるようになったため、句のオペランドはandになります。はどちらのオペランドにも列がないため、結果はエラーになります。結合を処理できるようにするには、句のオペランドがandになるように、最初の 2 つのテーブルを括弧で明示的にグループ化します。t1,t2(t1,t2)JOINONt2t3t1.i1Unknown 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 JOINLEFT JOIN、およびが混在するステートメントにも適用されますRIGHT JOIN。これらはすべて、カンマ演算子よりも優先されます。

于 2012-05-11T18:32:23.187 に答える
1

またはmysqlキーワードです!_or & try again! など、別のものに置き換えてください。

于 2012-05-11T18:18:12.740 に答える