Predlazem da napravis prvo dva kveria (views ako radis u MS SQL). Kveriji su prosti:
vwLogIn:
Code:
SELECT tblLogTable.Id, tblLogTable.UserID, tblLogTable.LogInOut, tblLogTable.Time
FROM tblLogTable
WHERE (((tblLogTable.LogInOut)=1));
vwLogout:
Code:
SELECT tblLogTable.Id, tblLogTable.UserID, tblLogTable.LogInOut, tblLogTable.Time
FROM tblLogTable
WHERE (((tblLogTable.LogInOut)=0));
Kao sto vidis, kveriju prikazuju sve LogIn i sve LogOut operacije. Ako pretpostavimo da svaku LogIn operaciju prati LogOut operacija, onda moze da se napise treci kveri, koji koristi prethodna dva:
vwLogInOut:
Code:
SELECT vwLogIn.UserID, vwLogIn.Time, vwLogOut.Time
FROM vwLogIn, vwLogOut
WHERE (((vwLogOut.Id)=(SELECT MIN(id) FROM vwLogOut WHERE vwLogout.ID>vwLogIn.ID AND vwLogIn.UserID=vwLogOut.UserID)))
ORDER BY vwLogIn.Time;
Ovo je sve cut/paste iz Access-a (tamo brze napravim tabelu :-)
ali bi trebalo da bez ikakvih izmena da radi i u MS SQL. Za druge platforme - eto ti ideja - subkveri u WHERE iskazu.
Ovo sve radi ako i samo ako posle svakog LogIn sledi LogOut. Ako aplikacija dozvoljava da se naprimer neko dva puta LogIn bez LogOut izmedju, nece biti tacan racun, ali tu nije kveri kriv.
Mozda ti treba i neki kveri koji pronalazi slocajeve visetrukog LogIn ili LogOut, bez odgovarajuce kontra operacije? Ili nesto sto lovi slucajeve kad se neko uloguje danas a odloguje posle tri dana?
:-)