Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL 5.1.56中的查询失败?_Mysql - Fatal编程技术网

为什么MySQL 5.1.56中的查询失败?

为什么MySQL 5.1.56中的查询失败?,mysql,Mysql,以下查询在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.

以下查询在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,因此结构应该相同。)


products表有一个product_id列,类型为int(10)。收藏夹表还有一个int(10)类型的product_id列。发生了什么事?

从表中轻松交换订单:

FROM users, products LEFT JOIN

小心,您正在混合。

与从表中交换命令一样简单:

FROM users, products LEFT JOIN

小心,您在混用。

在5.1版的MySQL中,连接处理运算符的优先级已更改。对于从5.0升级的用户来说,这是一个常见的问题

在5.1版本的MySQL中,联接处理运算符优先级已更改。对于从5.0升级的用户来说,这是一个常见的问题

这是您的原始查询,重新格式化了一点,并添加了两个括号:

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, 
       (  -- 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)是一个坏主意

使用:


=连接速度会很慢(它实际上是笛卡尔积)。

谢谢,这个解释很有帮助。看起来,如果我不混合连接符号,我可以在将来避免我原来的问题。一般来说,是的。在FROM子句中使用逗号分隔的表表达式列表应该知道符号的存在,以便在看到它时能够理解它。除非是因为过时的编码标准而被迫这样做,否则不应该编写这种类型的连接。默认情况下使用显式JOIN/ON表示法。谢谢,此解释非常有用。看起来,如果我不混合连接符号,我可以在将来避免我原来的问题。一般来说,是的。在FROM子句中使用逗号分隔的表表达式列表应该知道符号的存在,以便在看到它时能够理解它。除非是因为过时的编码标准而被迫这样做,否则不应该编写这种类型的连接。默认情况下使用显式JOIN/ON表示法。