簡體   English   中英

我的SQL查詢有什么問題?

[英]What is wrong with my SQL query?

我試圖將另一個表添加到已經運行的查詢中,但由於某種原因我收到錯誤。 我不確定查詢是否足以繼續,因為它是由另一個函數運行但我認為它可能只是我的查詢..

這是有效的原始查詢:

$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 . "'";

我的查詢是否有任何問題?

問題是您將逗號樣式的連接語法與JOIN關鍵字混合在一起。 因為它們具有不同的優先級,所以不按預期的順序執行連接(您可能期望從左到右的順序)。

MySQL手冊特別警告混合兩種類型的連接:

但是,逗號運算符的優先級小於INNER JOIN,CROSS JOIN,LEFT JOIN等。 如果在存在連接條件時將逗號連接與其他連接類型混合,則可能會出現'on子句'中未知列'col_name'形式的錯誤。

您可以修復錯誤的一個簡單更改是切換TABLE_PRODUCTS_ATTRIBUTESTABLE_PRODUCTS的順序:

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

但是,這並不能解決實際問題 - 您的查詢無法維護。 更好的是更改所有逗號樣式的連接以使用JOIN關鍵字。 這將需要從頭開始重寫整個查詢,但這將使將來更容易修改。

嘗試在查詢中更改該行:

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

至:

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

括號將不確定表連接的順序是您期望的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM