1

すでに機能しているクエリに別のテーブルを追加しようとしていますが、何らかの理由でエラーが発生しています。別の関数によって実行されているため、クエリを続行するのに十分かどうかはわかりませんが、それは私のクエリかもしれません..

動作する元のクエリは次のとおりです。

$listing_sql = "select " . $select_column_list . " p.products_id, p.products_model,   

p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, 
s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, 
s.specials_new_products_price, p.products_price) as final_price 

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p 
left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id 
left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id,
" . TABLE_PRODUCTS_TO_CATEGORIES . " p2c

where p.products_status = '1' and p.products_id = p2c.products_id and 
pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and 
p2c.categories_id = '" . (int)$current_category_id . "'";

そして、追加されたテーブルと where 句 (TABLE_PRODUCTS_ATTRIBUTESは新しいテーブル pa)を使用した新しいクエリを次に示します。

$listing_sql = "select " . $select_column_list . " p.products_id, p.products_model, 
p.manufacturers_id, p.products_price, pa.products_values_id, p.products_tax_class_id, 
IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, 
IF(s.status, s.specials_new_products_price, p.products_price) as final_price 

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p, " . 

TABLE_PRODUCTS_ATTRIBUTES . " pa
left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id 
left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id,
" . TABLE_PRODUCTS_TO_CATEGORIES . " p2c

where p.products_status = '1' and p.products_id = p2c.products_id and p.products_id = 
pa.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . 
(int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";

すぐにクエリに何か問題がありますか?

4

2 に答える 2

3

問題は、カンマ スタイルの結合構文と JOIN キーワードを混在させていることです。優先順位が異なるため、結合は期待した順序で実行されていません (左から右の順序を期待していた可能性があります)。

MySQLのマニュアルでは、2 種類の結合を混在させることについて特に警告しています。

ただし、コンマ演算子の優先順位は、INNER JOIN、CROSS JOIN、LEFT JOIN などよりも低くなります。結合条件があるときにカンマ結合と他の結合タイプを混在させると、「on 句」の不明な列「col_name」という形式のエラーが発生する場合があります。

エラーを修正するために行うことができる簡単な変更は、 と の順序を入れ替えることTABLE_PRODUCTS_ATTRIBUTESですTABLE_PRODUCTS

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, "
. TABLE_PRODUCTS_ATTRIBUTES . " pa, "
. TABLE_PRODUCTS . " p

ただし、これは実際の問題を解決するものではありません。つまり、クエリが維持できないということです。JOINキーワードを使用するようにすべてのカンマ形式の結合を変更することをお勧めします。これには、クエリ全体を最初から書き直す必要がありますが、将来の変更がはるかに簡単になります。

于 2012-06-29T18:19:16.663 に答える
0

クエリでその行を変更してみてください。

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_ATTRIBUTES . " pa

に:

from (" . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_ATTRIBUTES . " pa)

括弧は、テーブルが結合される順序が期待どおりであることを保証しません。

于 2012-06-29T18:27:54.383 に答える