2017-02-24 2 views
1

Ich brauche ein wenig Unterstützung mit MySQL-Abfragen. So funktioniert meine Anwendung und danach werde ich erklären, was ich im Backend machen möchte.MySQL Event-Scheduler mit zwei Abfragen erstellen

In der Anwendung können Benutzer Ereignisse erstellen (etwas wie Facebook hat) und automatisch mit diesen Ereignissen werden zwei Gruppen erstellt. Danach können Benutzer diesen Ereignissen beitreten und diese beiden Gruppen in einem Ereignis verbinden. Jetzt haben diese Ereignisse das Ablaufdatum. Wenn Benutzer diese Gruppen nicht rechtzeitig ausfüllen, wird das Ereignis automatisch abgebrochen.

Also ich muss Ereignis in mysql planen und prüfen, ob Gruppen in Ereignis mit minimaler Anzahl von Benutzern gefüllt sind und dieses Ereignis sollte jede Minute ausgelöst werden.

Dies ist, wie meine Tabellen aussieht:

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

groups 
- id 

user_groups 
- id 
- user_id 
- group_id 

Das ist also einige Bedingungen meine Frage haben sollte:

Anzahl von Benutzern in zwei Gruppen sollten

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

Antwort

1

größer als 10 Abfrage:

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; 


Erläuterung:

Um die Anzahl der Teilnehmer in einer Gruppe zu zählen, eine Aggregation Abfrage müßte auf user_groups ausgeführt werden. Jetzt, da es zweigroup_id s in der eventtab (innerhalb der gleichen Tabelle) gibt, wären zwei separate Aggregationsabfragen erforderlich. Dies ist, was die beiden LEFT JOIN s sind.

Es kann auch möglich sein, dass es keine Benutzer für eine bestimmte group_id (d. H. Keine übereinstimmenden Datensätze) in user_groups Tabelle gibt. Dies bedeutet, dass die LEFT JOIN mit der group_id (d. H. oder group_two_id) VON eventtabNULL Werte zurückgeben würde, wenn die JOIN in Wirkung ist. Die Abfrage sollte daher diese NULL-Werte als 0 betrachten, statt den Kandidaten group_id s in der eventtab zu finden, für den event_status auf 2 festgelegt werden sollte.


Annahme:

Eine hier gemachten Annahme ist, dass die Ereignis abgeblasen würde, wenn die Anzahl der Anzahl der Benutzer in einem der mit dem Ereignis verknüpfte Gruppen weniger als 10. Wenn die kombinierte Zählung sollte in Betracht gezogen werden, dann würde die Abfrage nur eine geringfügige zwicken müssen Sie wie folgt vor:

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


Demo

Hoffnung, das hilft.

+0

Viel hat mir sehr geholfen. Wirklich detaillierte Erklärung. Danke Kumpel! –

Verwandte Themen