SQL Status użytkownika

Odpowiedz Nowy wątek
2019-08-08 20:36
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, 2019-08-08 20:38
To kiepski model danych do celu który opisujesz, powinieneś mieć tabelkę gdzie dla danego ID jest aktualny status a historię przechowujesz osobno. - ralf 2019-08-09 11:20

Pozostało 580 znaków

2019-08-08 22:16
0

Np tak:


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, 2019-08-09 09:36
Błąd.. Query Error: error: column reference "ID" is ambiguous - NemezisK 2019-08-09 06:55
Masz poprawione - dodaj alias t1 do ID w pierwszym SELECT (+ wstawiłem status Z w apostrofy) - BlackBad 2019-08-09 09:37

Pozostało 580 znaków

2019-08-08 22:52
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:

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, 2019-08-08 22:54
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 :) - BlackBad 2019-08-08 22:58
Skoro nie zapisze wylogowania, to znaczy, że nie jesteś wylogowany ;) - Spearhead 2019-08-08 23:05
hehe teoretycznie tak - w praktyce to zależy jak dobrze jest napisany kod ;) - BlackBad 2019-08-08 23:10
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? - axelbest 2019-08-08 23:18
Good point +1 - Spearhead 2019-08-08 23:37
@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. - BlackBad 2019-08-09 09:34

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0