2013-10-23 37 views
0

我有一個MySQL表department_members包含單個部門中每個人的字符串字段(member_name)和int字段(recent_actions)的行。對於所有行,Recent_actions當前爲NULL。更新MySQL表與計數從子查詢如果字符串匹配,否則設置爲零

我還有另一張更大的表company_actions,其中包含一行,每次在整個公司中有人在過去的一年中執行過這種類型的操作。每行有一個member_name, timestamp,和一個獨特的action_id

我想更新department_members.recent_actions,並計算過去兩週內該成員執行此類操作的次數。如果他們最近沒有執行任何操作,我想用012更新department_members.recent_actions

我試過各種CASE和IF方法,但是我無法獲得正確的語法。

僞代碼,這就是我想要做的事:

UPDATE department_members AS d, 
    (SELECT COUNT(action_id) AS recent, member_name 
     FROM company_actions 
     WHERE timestamp > DATE_SUB(NOW(), INTERVAL 14 DAY) AS tmp 
/* then do something like this, only for real: */ 
IF d.member_name IN tmp(member_names) THEN d.recent_actions = tmp.recent 
    WHERE d.member_name = tmp.member_name 
ELSE IF d.member_name NOT IN tmp(member_names) THEN d.recent_actions = 0 

希望橫跨東西我要去,因爲我得到?任何幫助,將不勝感激!我一整天都在毆打這個問題。

+0

['CASE'](http://dev.mysql.com/doc/refman/5.7/en/case.html)條款應該適合該法案。用'CASE'顯示你的查詢。 –

回答

1

加入department_members,子查詢使用LEFT JOIN計算表company_actions中總數action_id

COALESCE()返回params列表中的第一個非空值。

UPDATE department_members a 
     LEFT JOIN 
     (
      SELECT member_name, COUNT(*) TotalAction 
      FROM company_actions 
      WHERE timestamp > DATE_SUB(NOW(), INTERVAL 14 DAY) 
      GROUP BY member_name 
     ) b ON a.member_name = b.member_name 
SET  a.action_id = COALESCE(b.TotalAction, 0) 
+0

謝謝!這就像一個魅力:) –

相關問題