Heim > Fragen und Antworten > Hauptteil
Ich versuche wöchentlich zu scrollen, um zu sehen, ob ein Benutzer an einer Veranstaltung teilgenommen hat oder nicht. Allerdings möchte ich sie nur dann als „Nicht besucht“ auflisten, wenn sie letzte Woche anwesend waren . Wenn ein Benutzer beispielsweise die Wochen 1 und 7 besucht hat, wird er nur in den Wochen 2 und 8 als „nicht anwesend“ gezählt.
Vereinfachtes Beispiel für Daten:
Tabelle Ereignisse, die alle Veranstaltungstermine (wöchentlich) und eindeutige Veranstaltungs-IDs (zeitlich aufsteigend)
enthältEvent_Date | Event_ID |
---|---|
09.03.2023 | 1 |
16.03.2023 | 2 |
23.03.2023 | 3 |
Tabelle Benutzer mit den Veranstaltungsdaten und IDs, an denen sie teilgenommen haben:
Event_Date | Event_ID | Benutzer_ID |
---|---|---|
09.03.2023 | 1 | 151 |
16.03.2023 | 2 | 151 |
23.03.2023 | 3 | 151 |
09.03.2023 | 1 | 299 |
23.03.2023 | 3 | 299 |
16.03.2023 | 2 | 373 |
Meine Frage: Wie vervollständige ich die folgende Ausgabe mit SQL? (Benutzer 299 nahm an Aktivität 1, aber nicht an Aktivität 2 teil; Benutzer 373 nahm an Aktivität 2, aber nicht an Aktivität 3 teil)
Verpasstes_Ereignisdatum | Missed_Event_ID | Benutzer_ID |
---|---|---|
16.03.2023 | 2 | 299 |
23.03.2023 | 3 | 373 |
Ich habe es mit
versuchtSELECT Event_ID + 1, User_ID FROM users u WHERE NOT EXISTS (SELECT 1 FROM events WHERE u.Event_ID=e.Event_ID + 1)
Keine korrekte Ausgabe erzeugt
P粉8185616822023-09-08 11:03:22
假设 Event_ID
增加 1,您也可以考虑以下内容。
SELECT u.Event_ID + 1 AS Missed_Event_ID, u.User_ID FROM users u LEFT JOIN users v ON u.User_ID = v.User_ID AND u.Event_ID + 1 = v.Event_ID WHERE v.Event_ID IS NULL AND u.Event_ID < (SELECT MAX(Event_ID) FROM events); -- Query results +-----------------+---------+ | Missed_Event_ID | User_ID | +-----------------+---------+ | 2 | 299 | | 3 | 373 | +-----------------+---------+