2017-02-24 22 views
1

我需要與MySQL查詢一點點支持。 所以這就是我的應用程序的工作原理,之後我將解釋我想在後端做什麼。的MySQL創建事件調度與兩個查詢

在應用程序的用戶可以創建活動(類似於Facebook的),以及與這些事件自動,正在創建太兩組。之後,用戶可以加入這些活動並加入這兩組活動。現在這些事件有到期日期,所以如果用戶沒有按時填寫這些組,事件將被自動取消。

所以我需要在mysql中安排活動,並檢查是否在事件組與用戶的最小數量的填補了這個事件應該觸發每隔一分鐘。

這是我的表的樣子:

event 
- id 
- group_one_id (Foreign key) 
- group_two_id (Foreign key) 

groups 
- id 

user_groups 
- id 
- user_id 
- group_id 

所以這是一些條件我的查詢應具備:在兩組用戶

數應大於10

CREATE EVENT myevent 
ON SCHEDULE EVERY 50 SECOND 
DO 
UPDATE events 
SET status = 2 // event is canceled 
WHERE .. // here i need help 

回答

1

查詢:

UPDATE eventtab e 
    LEFT JOIN 
    (
     SELECT group_id, count(user_id) AS group_one_users_count 
     FROM user_groups 
      GROUP BY group_id 
    ) temp1 
    ON e.group_one_id = temp1.group_id 
    LEFT JOIN 
    (
     SELECT group_id, count(user_id) AS group_two_users_count 
     FROM user_groups 
      GROUP BY group_id 
    ) temp2 
    ON e.group_two_id = temp2.group_id 
SET event_status = 2 
WHERE 
    IFNULL(group_one_users_count, 0) < 10 
OR IFNULL(group_two_users_count, 0) < 10; 


說明:

爲了能算一組參與者的數量,聚集查詢將需要對user_groups運行。現在既然有 group_id S IN的eventtab(同一個表內),兩個獨立的聚集查詢是必需的。這就是兩個LEFT JOIN

user_groups中的某個group_id(即沒有匹配的記錄)沒有任何用戶也是可能的。這意味着當JOIN有效時,LEFT JOINgroup_id(即group_one_idgroup_two_id)從eventtab將返回NULL值。因此,查詢應該考慮到這些NULL0,而不是當場候選group_id S IN爲此event_status應設置爲2eventtab


假設:

這裏作出的假設是事件會被取消,如果在任何與事件相關聯組的用戶數的計數小於10。如果組合計數應該被考慮,然後如下查詢只需要一個小的調整:

WHERE 
    (IFNULL(group_one_users_count, 0) 
     + 
     IFNULL(group_two_users_count, 0) 
    ) < 10 


Demo

希望有所幫助。

+0

對我有很大的幫助。真的很詳細的解釋。謝謝哥們! –