簡體   English   中英

為什么此查詢在MySQL 5.1.56中失敗?

[英]why does this query fail in MySQL 5.1.56?

以下查詢在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,因此結構應相同。)

產品表確實有一個int(10)類型的product_id列。 收藏夾表還具有類型為int(10)的product_id列。 到底是怎么回事?

與從表順序交換一樣容易:

FROM users, products LEFT JOIN

請注意,您正在混合聯接符號

在MySQL中,JOIN處理運算符的優先級在5.1中已更改。 在5.0.12更改后 ,人們從5.0 MySQL LEFT JOIN升級是一個常見問題-如何重寫查詢

這是您的原始查詢,對其進行了重新格式化,並添加了兩個括號:

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

!=連接將會很慢(實際上是笛卡爾積)。

暫無
暫無

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

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