• 15.05.2024, 21:05
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Hilfe bei SQL Statement

Freitag, 29. Februar 2008, 17:15

Hallo zusammen,

ich bräuchte mal etwas hilfe bei einem SQL Statement.
Ich habe eine Tabelle in der Ereignisse protokolliert werden.
Die tabelle verfügt über folgende Felder:

Primary_key
Action
TimeStamp
ID

Ich brauche jetzt quasi alle Primarykeys bei denen einbestimmtes Ereigniss aufgetreten ist, nach(zeitlich) denen aber kein anderes bestimmtes Ereigniss eingetreten ist!

In der Tabelle werden An- und Abmeldung protokolliert!
Ich will jetzt quasi sehen wer noch angemeldet ist!

Ist so etwas überhaupt nur mit SQL möglich?

Also mittels schleifen etc. ist das ja kein Problem, aber ich würde lieber soviel wie möglich in einem SQL Statement erledigen, da es sonst so viele Abfragen werden könnten!

THX

Myst

Re: Hilfe bei SQL Statement

Freitag, 29. Februar 2008, 22:13

Vorweg: Ein Attribut wie eine Attributrolle ("primary key") zu benennen, ist eine *ganz* schlechte Idee. `ID` sollte bereits eindeutig sein, daher ja der Name, und auch dementsprechend den besten Kandidat für den Primärschlüssel darstellen.

Ansonsten: Ja, das geht. Möglicherweise schon mit WHERE, evtl. über HAVING, wenn's sein muss mit Subqueries und Notfalls mit Funktionen, vielleicht auch über einen Self-Join. Was davon möglich ist, hängt wiederum vom verwendeten RDMBS ab.

Mein jüngster Ansatz besteht darin, zunächst den Zeitpunkt der letzten Aktion jedes Benutzers (ich nehme mal an, dass `ID` die Benutzer-ID repräsentiert) zu ermitteln, jeweils für An- und Abmeldung:

Quellcode

1
2
3
4
5
6
7
8
9
SELECT MAX(timestamp) AS last_logon
FROM log
WHERE action = 'logon'
GROUP BY ID;

SELECT MAX(timestamp) AS last_logoff
FROM log
WHERE action = 'logoff'
GROUP BY ID;

Da ich die Subquery-Syntax nicht parat habe, folgendes als funktionieren angenommes SQL ;), mit dem die beiden Ergebnisse dann verglichen werden:

Quellcode

1
SELECT (last_logon > last_logoff) AS user_is_logged_in;

Möglicherweise lassen sich die ersten beiden Queries direkt als Subqueries anstelle der beiden Platzhalter einsetzen.

Sofern die Actions nur An- und Abmeldung darstellen, dürfte bereits dieses klappen:

Quellcode

1
2
3
4
SELECT (action = 'logon') AS user_is_logged_in
FROM log
ORDER BY timestamp
LIMIT 1

Re: Hilfe bei SQL Statement

Samstag, 1. März 2008, 09:35

hi,

mach´s doch einfacher, mit einer kleinen zusätzlichen "angemeldet" tabelle. bei anmeldung reinschreiben, bei abmeldung löschen.

manchmal ist redundanz sinnvoll. das mußt du aber selber abschätzen.

anderer ansatz: alle user auslesen, die eine ungerade datensatzanzahl haben und den mit letztem timestamp abfragen.

gruß seaslug

Re: Hilfe bei SQL Statement

Samstag, 1. März 2008, 11:07

Ich gehe mal davon aus, dass ID der Benutzer ist (der aber nicht ID heißen sollte). Wie Yogi schon gesagt hat, sollte ID der Primary Key sein und der Benutzer über user_id oder ähnliches angesprochen werden. Aber gut:

Quellcode

1
SELECT Primary_key, ID AS user FROM deinetabelle WHERE action='Angemeldet' AND NOT (SELECT Action FROM deinetabelle WHERE ID=user ORDER BY TimeStamp DESC LIMIT 1)='Abgemeldet';


Fehler mit doppelte Spaltennamen musst du grad mal selbst beheben :)

Spaltennamen klein schreiben trägt im übrigen auch zur Übersicht bei. Ich stimme aber Seaslug auch zu, dass das keine gute Methode ist die Benutzeranmeldung durchzuführen. Was passiert wenn einem Benutzer mal der Rechner abschmiert, ohne dass er sich abmeldet? Oder er einfach so aufmacht? TCP-Verbindungen zu beobachten ist sicher machbar, aber aufwändiger als nötig.

Re: Hilfe bei SQL Statement

Montag, 3. März 2008, 13:19

Zitat von »seaslug«

mach´s doch einfacher, mit einer kleinen zusätzlichen "angemeldet" tabelle. bei anmeldung reinschreiben, bei abmeldung löschen.

Frag sich ja, ob er das Model und/oder die Applikation entsprechend ändern oder erweitern darf.

Ich persönlich habe für solche Informationen in der User-Tabelle ein Feld "last_acted_at", das bei jedem Hit mit der momentanen Zeit aktualisiert wird. Ich führe allerdings auch kein Log der Events (habe ich mal gemacht, wurden mir zu viele Daten) und so werden Abmeldungen auch nicht konkret erfasst (so dass nun die Zustandslosigkeit von HTTP wieder ins Spiel kommt). Wenn der User dann z.B. fünf oder zehn Minuten nicht mehr reagiert hat, kann man ihn (natürlich nicht absolut sicher) als abgemeldet/offline/weg betrachten (`SELECT name FROM users WHERE (NOW() - last_acted_at) < 5` - oder so, je nach verwendeten Feldtypen und anderen Faktoren).