2017-02-24 9 views
1

MySQLクエリで少しサポートが必要です。 これは私のアプリケーションがどのように動作するかを示しています。その後、バックエンドで何をしたいのかを説明します。MySQLは2つのクエリでイベントスケジューラを作成します

アプリケーションユーザーは、イベント(Facebookのようなもの)を作成し、それらのイベントとともに自動的に2つのグループを作成することができます。その後、ユーザーはこれらのイベントに参加し、イベントでこれらの2つのグループに参加できます。現在、これらのイベントは有効期限を持っているため、ユーザーがこれらのグループを時間通りに入力しなければ、イベントは自動的に取り消されます。

私はmysqlでイベントをスケジュールし、イベントのグループが最小限のユーザーで満たされていることを確認する必要があり、このイベントは1分ごとにトリガーされる必要があります。

これは私のテーブルがどのように見えるかです:

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

groups 
- id 

user_groups 
- id 
- user_id 
- group_id 

だから、これは私のクエリが持つべきいくつかの条件である:二つのグループ内のユーザの

Countがあるべきよりも大きい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上で実行される必要があるであろう、グループの参加者数をカウントすることができるようにします。今度は、eventtab(同じ表内)にの2つのgroup_idがあるため、2つの別々の集約クエリが必要になります。これは2つのLEFT JOINのためにそこにあるものです。

テーブルに特定のgroup_idのユーザーがいない(一致するレコードがない)可能性があります。つまり、LEFT JOINgroup_idgroup_one_idまたはgroup_two_id)からeventtabになると、JOINが有効なときにNULLの値が返されます。したがって、これらのNULLの値は、event_status2に設定するeventtabの候補group_idを見つけ出すために、これらのNULLの値を0と見なす必要があります。


仮定:

ここでの仮定は、イベントに関連付けられたグループのいずれかのユーザー数のカウントが10未満の場合イベントはオフと呼ばれるだろうということです。組み合わせ数が考慮されることになった場合は、次のようにクエリは、わずかな微調整が必​​要になります役立ちます

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


Demo

希望を。

+0

多くの助けになりました。本当に詳細な説明。ありがとう! –

関連する問題