2012-11-04 37 views
0

下面的查詢在MySQL 56年5月1日失效:爲什麼此查詢在MySQL 5.1.56中失敗?

SELECT 
shop_id, products.product_id AS 
product_id, brand, title, price, image, image_width, image_height 

FROM products, users LEFT JOIN 

(
    SELECT fav5.product_id AS product_id, SUM(CASE 
    WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1 
    WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1 
    ELSE 0 
    END) AS favorites_count 
    FROM favorites fav5 
    GROUP BY fav5.product_id 

) AS fav6 ON products.product_id=fav6.product_id 
WHERE products.product_id= 46876 AND users.user_id!=products.product_id 

的錯誤是

#1054 - Unknown column 'products.product_id' in 'on clause' 

未經用戶表此修改不會失敗:

SELECT 
shop_id, products.product_id AS 
product_id, brand, title, price, image, image_width, image_height 

FROM products LEFT JOIN 

(
    SELECT fav5.product_id AS product_id, SUM(CASE 
    WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1 
    WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1 
    ELSE 0 
    END) AS favorites_count 
    FROM favorites fav5 
    GROUP BY fav5.product_id 

) AS fav6 ON products.product_id=fav6.product_id 
WHERE products.product_id= 46876 

無論查詢中失敗MySQL 5.0.67。 (我從5.0.67導出數據庫並導入到5.1.56中,因此結構應該是相同的。)

產品表的確有product_id列,類型爲int(10)。收藏夾表中還有一個int類型的product_id列(10)。到底是怎麼回事?

回答

2

一樣方便從表調劑訂購:

FROM users, products LEFT JOIN 

要小心,你混合join notations

1

這是你的原始查詢升級一個共同的問題,重新格式化一點點,有兩個括號補充說:

SELECT shop_id, products.product_id AS 
     product_id, brand, title, price, image, image_width, image_height 
    FROM products, 
     ( -- Parenthesis added 
     users LEFT JOIN 
     (
      SELECT fav5.product_id AS product_id, SUM(CASE 
      WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1 
      WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1 
      ELSE 0 
      END) AS favorites_count 
      FROM favorites fav5 
      GROUP BY fav5.product_id 
     ) AS fav6 ON products.product_id=fav6.product_id 
    ) -- Parenthesis added 
WHERE products.product_id= 46876 AND users.user_id!=products.product_id 

括號中指明的SQL語法分析器是如何解釋的查詢,在添加的括號內沒有products表。

混合舊式和新式(如自SQL-92以來)樣式連接是一個壞主意。

用途:

SELECT shop_id, products.product_id AS 
     product_id, brand, title, price, image, image_width, image_height 
    FROM products JOIN users ON users.user_id != products.product_id 
    LEFT JOIN 
     (SELECT fav5.product_id AS product_id, 
       SUM(CASE WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1 
         WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1 
         ELSE 0 
        END) AS favorites_count 
      FROM favorites fav5 
     GROUP BY fav5.product_id 
     ) AS fav6 ON products.product_id=fav6.product_id 
WHERE products.product_id = 46876 

!=聯接將是緩慢的(它實際上是一個笛卡爾乘積)。

+0

謝謝這個解釋很有幫助。看起來如果我不混合加入符號,我可以在將來避免我原來的問題。 – jela

+0

一般來說,是的。您應該在FROM子句中使用以逗號分隔的表表達式列表來了解符號的存在,以便您在看到它時能夠理解它。除非您被迫使用過時的編碼標準,否則不應編寫這種連接方式。默認情況下使用顯式JOIN/ON表示法。 –