【问题标题】:SQL Syntax Error - updating while joining two tablesSQL 语法错误 - 连接两个表时更新
【发布时间】:2015-03-03 16:09:37
【问题描述】:

谁能帮我理解为什么我在尝试运行此查询时遇到语法错误?

UPDATE exp_store_orders
SET exp_store_orders.order_status_name = "Digital"
    JOIN exp_store_order_items
        ON exp_store_orders.id = exp_store_order_items.order_id
    JOIN exp_channel_data
        ON exp_store_order_items.entry_id = exp_channel_data.entry_id
GROUP BY exp_store_order_items.order_id
HAVING COUNT(CASE exp_channel_data.field_id_50 WHEN '' THEN null ELSE 1 END) =     COUNT(exp_store_order_items.order_id)

这会显示我要更新的订单的 ID,但由于某种原因,上面会出现语法错误。

SELECT exp_store_orders.id
FROM exp_store_orders
    JOIN exp_store_order_items
        ON exp_store_orders.id = exp_store_order_items.order_id
    JOIN exp_channel_data
        ON exp_store_order_items.entry_id = exp_channel_data.entry_id
GROUP BY exp_store_order_items.order_id
HAVING COUNT(CASE exp_channel_data.field_id_50 WHEN '' THEN null ELSE 1 END) =     COUNT(exp_store_order_items.order_id)

感谢任何帮助,谢谢!

【问题讨论】:

  • 你得到什么错误?
  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“JOIN exp_store_order_items ON exp_store_orders.id = exp_store_order_items.ord”附近使用正确的语法
  • 有 field_id_49 吗?另外,分组你计算的东西有点奇怪!?!?!如果是我,我会从一些合适的 DDL 和想要的结果重新开始。
  • 是的,有一个 field_id_49。
  • 这就是我想要做的。我需要一种方法来标记我们商店中纯数字内容的订单。数字商品在 field_id_50 中有一个 url,每个订单可以有多个商品,所以我正在计算带有 URL 的商品的数量,并将该数字与订单中的商品总数进行比较。

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


【解决方案1】:

在 MySQL 中,updatejoin 的正确语法是 join 之前 set。此外,group by 不允许在 update 中。

相反,从子查询中获取列表并使用另一个join 来设置行。子查询实际上不需要exp_store_orders,因此可以将其删除:

UPDATE exp_store_orders o JOIN
       (SELECT oi.order_id
        FROM exp_store_order_items oi JOIN
             exp_channel_data cd
             ON oi.entry_id = cd.entry_id
        GROUP BY oi.order_id
        HAVING COUNT(CASE cd.field_id_50 WHEN '' THEN null ELSE 1 END) = COUNT(oi.order_id)
       ) ou
       on o.id = ou.order_id
    SET o.order_status_name = 'Digital';

【讨论】:

  • 这似乎会起作用,您能否解释一下子查询后的“ou”是怎么回事?它给了我这个:#1054 - 'on Clause' 中的未知列 'ou.id'
  • 它应该将子查询视为它正在加入的另一个表吗?我想知道为什么不是。
【解决方案2】:

您的语句中缺少 WHERE 子句。

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多