Toon posts:

[SQL] probleem met gecorreleerde subquery

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het volgende:

Ik moet uit een logbestand logins en loguits met elkaar gaan "koppelen". Het probleem is dat er in het logbestand niet gewerkt wordt met sessies, alleen met bv: record 1: userid 1 LOGIN record2 :Userid 2 LOGUIT

Ik heb alle logins en loguits in twee verschillende tabellen gesplitst en dacht met deze query de juiste login aan de juiste loguit te koppelen:

code:
1
2
3
4
5
6
7
8
SELECT T_login.*, T_logout.Stamp AS LogoutTime
FROM T_login, T_logout
WHERE T_logout.Stamp=(
   SELECT MIN(x.stamp)
   FROM T_logout x 
   WHERE T_login.gebruikersID = x.gebruikersID AND 
                T_logout.stamp >= T_login.stamp)
ORDER BY T_login.Stamp;


Opzich werkt dit, alleen krijg ik nu bij ieder gebruikersID alléén de eerste sessie uit T_login... Dus niet, alle volgende sessies van die gebruiker.Iiemand tips?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
De vraag is eigenlijk al: waarom heb je logins en logouts in aparte tabellen gestopt ? Een logout hoort toch altijd bij een login ? Er kan geen logout zijn, zonder dat er een login geweest is. Waarom stop je deze informatie niet in één tabel; een tabel 'session' bv, waarin je de login-time en de logout-time bijhoudt ?

Met de query die je hier post , heb je trouwens een carthesisch produkt. Je hebt 2 tabellen in je from clause, maar je joined deze tabellen niet, wat dus resulteert in een cartesiaans product.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op dinsdag 23 januari 2007 @ 11:31:
De vraag is eigenlijk al: waarom heb je logins en logouts in aparte tabellen gestopt ? Een logout hoort toch altijd bij een login ? Er kan geen logout zijn, zonder dat er een login geweest is. Waarom stop je deze informatie niet in één tabel; een tabel 'session' bv, waarin je de login-time en de logout-time bijhoudt ?

Met de query die je hier post , heb je trouwens een carthesisch produkt. Je hebt 2 tabellen in je from clause, maar je joined deze tabellen niet, wat dus resulteert in een cartesiaans product.
Misschien had ik duidelijker moeten zijn, de login/logouts komen uit een dump van een (closed source) systeem, niet door mijzelf geprogrammeerd. Hier heb ik dus geen invloed op. Ik kan wel een login van een logout onderscheiden, en deze splits ik dus af in verschillende tabellen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Ipv die logout table in je FROM te zetten, zou je dit kunnen proberen (als je dbms dat ondersteund):
code:
1
2
3
4
5
select  .. , a.logouttime
from t_login, ( select min(t_logout.stamp) as logouttime
                      from t_logout 
                      where t_login.gebruikersId = t_logout.gebruikersId
                          and t_logout.stamp >= t_login.stamp ) as a

https://fgheysels.github.io/


  • 4VAlien
  • Registratie: November 2000
  • Laatst online: 11:00

4VAlien

Intarweb!

Je kan op beide tabellen het beste deze query uitvoeren:

Select <fields> from <table> order by Uid,Timestamp

De lijsten die je terugkrijgt uit beide queries bevatten nu op elke positie een login/loguit paar.

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Dit klopt, maar dan heb je toch nog steeds niet de logins en logouts gekoppeld.

Verwijderd

Topicstarter
whoami schreef op dinsdag 23 januari 2007 @ 11:59:
Ipv die logout table in je FROM te zetten, zou je dit kunnen proberen (als je dbms dat ondersteund):
code:
1
2
3
4
5
select  .. , a.logouttime
from t_login, ( select min(t_logout.stamp) as logouttime
                      from t_logout 
                      where t_login.gebruikersId = t_logout.gebruikersId
                          and t_logout.stamp >= t_login.stamp ) as a
'DBMS' (access :X ) ondersteunt het wel, maar nu krijg ik voor alle logins alleen de allereerste logout, en dat klopt dus ook niet...

Verwijderd

Topicstarter
4VAlien schreef op dinsdag 23 januari 2007 @ 12:04:
Je kan op beide tabellen het beste deze query uitvoeren:

Select <fields> from <table> order by Uid,Timestamp

De lijsten die je terugkrijgt uit beide queries bevatten nu op elke positie een login/loguit paar.
geen uid beschikbaar helaas.... wat je zegt zou kloppen, ware het niet dat gebruiker 1 en 6 zich kunnen aanmelden, waarna 6 eerst uitlogt en dan 1 pas... dan heb je geen paren meer...
whoami schreef op dinsdag 23 januari 2007 @ 11:31:
... wat dus resulteert in een cartesiaans product.
Nee, ik krijg 24 unieke "sessies" (van de 57)

[ Voor 17% gewijzigd door Verwijderd op 23-01-2007 12:25 ]


Verwijderd

Topicstarter
Opgelost:

code:
1
2
3
4
5
6
7
SELECT T_login.*, T_logout.Stamp AS LogoutTime
FROM T_login INNER JOIN T_logout ON T_login.GebruikersID = T_logout.GebruikersID
WHERE (((T_logout.Stamp)=(SELECT MIN(x.stamp)
   FROM T_logout x 
   WHERE (J_logout.gebruikersID) = x.gebruikersID AND 
x.stamp >= t_login.stamp group by x.gebruikersID order by min(x.stamp) asc)))
ORDER BY T_login.Stamp;


in de subquery moest ik verwijzen naar "x" ipv "T_logout"

Toch bedankt voor de inspiratie ;)
Pagina: 1