2013-03-26 74 views
5

我試圖做在MySQL中以下內容:選擇在MySQL

UPDATE 
    x 
SET 
    y = COALESCE(SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1, 
       SELECT z FROM table WHERE a = b AND c = d LIMIT 1, 
       SELECT z FROM table WHERE a = b LIMIT 1); 

聽起來很有效的給我。我正在嘗試更新的最佳合適值。如果我能找到符合3條標準的記錄 - >那就是我需要的記錄。除了符合2個標準的那個,否則一條記錄只匹配一個標準。

我可以在3個更新查詢中做到這一點,但我不明白爲什麼這不起作用。按照manual

COALESCE returns the first non-NULL value in the list, or NULL if there are no non-NULL values.

這正是我需要什麼。但它提供了以下錯誤:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT'

我在這裏失去了一些東西?

+0

你能發佈錯誤信息嗎? – Don 2013-03-26 13:12:14

+0

您是否能夠提供完整的查詢,即沒有您的泛化?這將有助於提供更準確的建議。 – 2013-03-26 13:12:42

+0

這只是一個1064語法錯誤。我的查詢基本上是這樣的。它在COALESCE中的SELECT中恰好給出了語法錯誤。 – Sherlock 2013-03-26 13:13:14

回答

9

你的問題可能是你得到的子查詢返回的z值超過1。你只能得到一個。

你可以嘗試:

update x 
set y = (select z from t where a = b 
     order by (case when a = b and c = d and e = f then 1 
         when a = b and c = d then 2 
         else 3 
        end) 
     limit 1 
     ); 

但是,您的特定語法錯誤是,你需要周圍的括號選擇。因此,這是語法正確的版本:

UPDATE 
    x 
SET 
    y = COALESCE((SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1), 
       (SELECT z FROM table WHERE a = b AND c = d LIMIT 1), 
       (SELECT z FROM table WHERE a = b LIMIT 1)); 
+0

我編輯我的帖子以包含LIMIT 1建議。錯誤仍然存​​在,但你的方式縫合非常乾淨,正是我所需要的。謝謝! – Sherlock 2013-03-26 13:15:29

+0

但還有一件事;爲什麼沒有聯盟工作?這不正是我的例子,是什麼COALESCE是什麼? – Sherlock 2013-03-26 13:16:37

+0

您也可以從案例中實際刪除a = b,因爲WHERE語句已經假定。 COALESCE適用於您具有值而不是處理子查詢 – 2013-03-26 13:16:57

2

這是很難沒有更多的細節,但建議這樣的事情可能工作

UPDATE 
    x 
SET y = COALESCE(
    (SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1), 
    (SELECT z FROM table WHERE a = b AND c = d LIMIT 1), 
    (SELECT z FROM table WHERE a = b LIMIT 1) 
); 

確保每個子查詢只返回到1行。