SQL Status użytkownika

SQL Status użytkownika
NK
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:8
0

Cześć,
Mam poniższą bazę

Nazwa tabeli - tabela

ID Czas Status
1 2019-01-02 11:15 Z
1 2019-01-02 11:45 N
2 2019-01-02 15:10 Z
2 2019-01-02 15:30 N
2 2019-01-02 17:20 Z

Z - oznacza zalogowany, N - niezalogowany

Chciałbym napisać zapytanie które zwróci mi zalogowanego użytkownika. Ale zalogowanego który się nie wylogował. Czyli patrząc tutaj wyżej dla ID 1 użytkownik się zalogował i wylogował to jego nie chcemy. Dla ID użytkownik się zalogował wylogował i zalogował i tu właśnie chcę otrzymać tą ten status gdzie się zalogował - jest zalogowany cały czas bo się nie wylogował. Czyli wynik

ID Czas Status
2 2019-01-02 17:20 Z
edytowany 1x, ostatnio: NemezisK
RA
To kiepski model danych do celu który opisujesz, powinieneś mieć tabelkę gdzie dla danego ID jest aktualny status a historię przechowujesz osobno.
BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 dni
  • Postów:454
0

Np tak:

Kopiuj

SELECT t1.ID, Czas, Status
FROM Tabela t1
INNER JOIN (SELECT ID, MAX(Czas) OstatniLog FROM Tabela Group by ID) t2
ON t1.ID = t2.ID
AND t1.Czas = t2.OstatniLog

WHERE Status = 'Z'

EDIT: dodany alias to ID

edytowany 2x, ostatnio: BlackBad
NK
Błąd.. Query Error: error: column reference "ID" is ambiguous
BlackBad
Masz poprawione - dodaj alias t1 do ID w pierwszym SELECT (+ wstawiłem status Z w apostrofy)
Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:minuta
  • Postów:1002
2

Skoro na przemian mamy logowanie i wylogowywanie to COUNT(id) jest parzysty dla niezalogowanych i nieparzysty dla zalogowanych. Zatem nie trzeba żadnych joinów i wystarczy:

Kopiuj
SELECT `id`, MAX(`time`) from `table` GROUP BY `id` HAVING COUNT(id) % 2 = 1

sqlfiddle: http://sqlfiddle.com/#!9/243040/1

Z tego tez wynika, że kolumna status jest nadmiarowa ;)

edytowany 1x, ostatnio: Spearhead
BlackBad
W sumie tak - chyba że coś się skasztani z sesjami logowania ;) i np nie zapisze poprawnego wylogowania :D ... ale Twoje rozwiązanie jest całkiem zgrabne przyznaje :)
Spearhead
Skoro nie zapisze wylogowania, to znaczy, że nie jesteś wylogowany ;)
BlackBad
hehe teoretycznie tak - w praktyce to zależy jak dobrze jest napisany kod ;)
axelbest
A jak można zapisać wylogowanie jeśli klientowi zabiorą prąd? A potem ten sam klient z zupełnie innego kompa zaloguje się ponownie?
BlackBad
@axelbest to właśnie miałem na myśli. Albo kiepsko napisany kod gdzie user zamyka okno / aplikacje, a nie klika "wyloguj" i takie zdarzenie jest nie oprogramowane itp. itd.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.