2014-11-06 48 views
0

我有兩個表,一個包含數十萬行的「數據」表和一個包含數百行的「設置」表。我需要更新設置表中的兩個值,基於數據表中一列的總和大於設置表中的另一列,其中設置表的'id'與數據表的'offerid'匹配。根據另一個表中的列的總和在一個表中設置兩個值

我一直在巡航谷歌看着許多可能的解決方案,但我似乎無法彎曲任何他們滿足我的需求。任何時候我開始和Joins一起工作,我不可避免地會被絆倒。

沒有工作

我的最新嘗試,是:

UPDATE settings a, data b 
SET a.hidden=1, a.weight=0 
WHERE a.id = b.offerid 
AND sum(b.views) > a.target 

我很喜歡這種香味的方法,因爲我認爲這實際上是對我有意義,但我得到的是"Error code 1111: Invalid us of group function"。也許這裏有人能指出我正確的方向。

回答

1

它的錯誤,因爲你使用聚合函數(SUM)無分組。所以查詢確實不知道應該將哪些行相加在一起。您可以使用這樣的子查詢:

UPDATE settings a 
    INNER JOIN 
    (
     SELECT 
     sum(b.views) sumviews, b.offerid 
     from data b 
     group by b.offerid 
    ) c on c.offerid = a.id 
SET a.hidden=1, a.weight=0 
where c.sumviews>a.target 

編輯:要禁用安全更新功能做以下步驟

按照以下步驟執行UPDATE命令之前:

Go to Edit --> Preferences 
Click "SQL Queries" tab and uncheck "Safe Updates" check box 
Query --> Reconnect to Server 
Now execute your sql query 

來源:Disable Safe Update

+0

謝謝你,但我只是得到'where'的語法錯誤。也應該是'sum(b.views)AS sumviews'?看起來像一個AS不見了我。 – 2014-11-06 00:47:19

+0

AS是可選的。你可以添加它,如果你想。它實際上對AS更具可讀性。我可以知道你有什麼錯誤嗎? – TheProvost 2014-11-06 00:53:48

+0

哦,現在。得到了集合,並在那裏互換。更新了我的答案,我打賭它已經OK了。不要忘了upvote和標記爲答案,如果這有助於你:) – TheProvost 2014-11-06 00:59:15

-1

嘗試使用

HAVING 

,而不是

AND 

所以,你的代碼是這樣:

UPDATE settings a, data b 
    SET a.hidden=1, a.weight=0 
    WHERE a.id = b.offerid 
    GROUP BY a.id 
    HAVING sum(b.views) > a.target 
+0

感謝邁克爾幫助初學者! – Vincent 2014-11-06 00:41:54

+0

非常有趣,謝謝!不幸的是,現在我剛剛從'having'得到了一個語法錯誤。 – 2014-11-06 00:44:27

+0

你不能使用「HAVING」而沒有group by子句。 downvoted這個,但可以取消,如果你編輯你的答案:) – TheProvost 2014-11-06 01:01:09