【问题标题】:MySQL throwing error on second JOINMySQL在第二次加入时抛出错误
【发布时间】:2013-09-17 05:27:57
【问题描述】:

我收到以下错误:

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'JOIN product_catalog ON product_catalog.entity_id

附近使用的正确语法

作为以下查询的结果:

SELECT sales_order.created_at , order_item.order_id, sales_order.increment_id, SUM(order_item.qty_ordered) AS qty_ordered , COUNT( * ) 

FROM order_item

JOIN sales_order
ON sales_order.entity_id = order_item.order_id
WHERE sales_order.created_at > '2012-11-15 00:00:00'

JOIN product_catalog
ON product_catalog.entity_id = order_item.product_id
WHERE product_catalog.size = 14

GROUP BY order_item.order_id;

过去,此查询的变体可用于按销售订单对不同类型的产品进行分组,我只需要执行一个JOIN 即可获得所需的所有信息。我遇到的问题来自第二个JOIN。显然我错过了一些东西,但我真的不确定是什么。 :(

【问题讨论】:

  • WHERE 子句适用于所有 JOIN 条件。
  • 是的,已经解决了。我不知道,很明显。 :) 谢谢!

标签: mysql sql join syntax-error inner-join


【解决方案1】:

请确保WHERE 条件毕竟必须是JOIN

SELECT sales_order.created_at , order_item.order_id, sales_order.increment_id, SUM(order_item.qty_ordered) AS qty_ordered , COUNT( * ) 

FROM order_item

JOIN sales_order
ON sales_order.entity_id = order_item.order_id

JOIN product_catalog
ON product_catalog.entity_id = order_item.product_id

WHERE product_catalog.size = 14
AND sales_order.created_at > '2012-11-15 00:00:00'
GROUP BY order_item.order_id;

首先你必须JOIN你需要的桌子。然后在WHERE 子句之后出现条件。

【讨论】:

  • 这个解决方案就像一个魅力。我不知道 WHERE 语句的位置,如果您只需要执行一次 JOIN,我认为这是可以预测的。谢谢!!
【解决方案2】:

您的WHERE 子句位于错误的位置。请参阅下面的代码以了解正确的 JOIN 语法。

SELECT sales_order.created_at, 
    order_item.order_id, 
    sales_order.increment_id, 
    SUM(order_item.qty_ordered) AS qty_ordered, 
    COUNT( * )
FROM order_item
JOIN sales_order
    ON sales_order.entity_id = order_item.order_id
    AND sales_order.created_at > '2012-11-15 00:00:00'
JOIN product_catalog
    ON product_catalog.entity_id = order_item.product_id
    AND product_catalog.size = 14
GROUP BY order_item.order_id

【讨论】:

    【解决方案3】:

    JOIN...ON... 子句也是输入条件的部分,因此您不需要 where 子句,只需添加 AND 即可。

    SELECT sales_order.created_at , order_item.order_id, sales_order.increment_id, 
           SUM(order_item.qty_ordered) AS qty_ordered , COUNT( * )     
    FROM order_item    
    JOIN sales_order ON sales_order.entity_id = order_item.order_id
                     and sales_order.created_at > '2012-11-15 00:00:00'
    JOIN product_catalog ON product_catalog.entity_id = order_item.product_id
                         and product_catalog.size = 14
    GROUP BY order_item.order_id;
    

    请考虑下面的示例,我添加了别名。使用它是一个好习惯,因为代码更具可读性。

    SELECT SO.created_at , OI.order_id, SO.increment_id, 
           SUM(OI.qty_ordered) AS qty_ordered , COUNT( * )     
    FROM order_item  OI  
    JOIN sales_order SO ON SO.entity_id = OI.order_id
                     and SO.created_at > '2012-11-15 00:00:00'
    JOIN product_catalog PC ON PC.entity_id = OI.product_id
                         and PS.size = 14
    GROUP BY OI.order_id;
    

    【讨论】:

    • 我不知道ON 可以和AND 一起使用。谢谢!
    • 我将尝试这个解决方案以及一个学习练习。 :)
    • 对我来说,要改进您的代码,最好在JOIN 部分保留相关条件。作为示例中的代码WHERE(不幸的是)。享受学习:)
    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多