2015-01-06 49 views
1

任何人都可以幫助我理解爲什麼在嘗試運行此查詢時遇到語法錯誤?SQL語法錯誤 - 在連接兩個表時更新

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) 

任何幫助表示讚賞,謝謝!

+1

你會得到什麼錯誤? –

+1

#1064 - 您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第3行的JOIN exp_store_order_items ON exp_store_orders.id = exp_store_order_items.ord附近使用正確的語法 –

+0

是否有field_id_49?另外,由*你計算的東西組成的團隊有點奇怪!?!?!如果是我,我會重新開始一些適當的DDL和期望的結果。 – Strawberry

回答

1

在MySQL正確的語法爲updatejoin是有joinset。另外,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'; 
+0

這看起來好像會起作用,你可以在子查詢後解釋'ou'是怎麼回事嗎?它給了我這個:#1054 - 'on子句'中未知列'ou.id' –

+0

這應該是看到子查詢作爲另一張表,它加入正確嗎?我想知道爲什麼它不是。 –

+0

好吧,你是一個勝利者,謝謝! –

0

你缺少你的語句中的WHERE子句。

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