我一整天都在尝试,但没有成功。我的系统中有3个表,如下所示:
***User***
UserID (PK)
Username
***Usertransaction***
UsertransactionID (PK) (auto_increment)
UserID (FK)
TransactionID (FK)
TimeStamp
***Transaction***
TransactionID (PK)
TransactioName
Tables and Test Data - SQLFiddle
当用户登录系统时,它会登录usertransaction表。 创建具有用户的UserID,transactionID和时间戳的记录。
这是登录:$Query="insert into usertransaction('$UserID',1)"
输入记录时,DBMS会自动生成时间戳。
当用户注销但具有不同的交易ID时,系统也会执行相同的操作。
这是退出:$Query="insert into usertransaction('$UserID',2)"
因此,登录和注销最终记录在同一个数据库中。用户可以进行大量登录和大量注销但是我想要最新的一次。 我一直在与SQL查询斗争,以返回已登录系统但尚未注销的所有用户的计数。 我知道它的圣诞节,但请帮助。
到目前为止我有这个:
select A.useriD,A.transactionID,A.Timestamp
from usertransaction
INNER JOIN
(
select userID, max(Timestamp) AS Latest_Login
from usertransaction
WHERE usertransaction=1
) AS B
ON A.UserID=B.UserID,A.transactionID=B.transactionID,A.Timestamp=B.Latest_Login
WHERE usertransaction=1
select A.useriD,A.transactionID,A.Timestamp
from usertransaction
INNER JOIN
(
select userID, max(Timestamp) AS Latest_Logout
from usertransaction
WHERE usertransaction=2
) AS B
ON A.UserID=B.UserID,A.transactionID=B.transactionID,A.Timestamp=B.Latest_Logout
WHERE usertransaction=2
我分别得到登录结果和注销结果。如何比较这两个语句并检查用户是否仍然登录?
答案 0 :(得分:1)
要获取具有登录记录但没有后续注销记录的用户列表,请使用LEFT OUTER JOIN将用户事务表连接到自身,然后排除注销列为空的记录
这样的事情: -
SELECT ut1.UserID,
ut1.transactionID,
ut1.Timestamp
FROM Usertransaction ut1
LEFT OUTER JOIN Usertransaction ut2
ON ut1.UserID = ut2.UserID
AND ut2.TransactionID = 6
AND ut1.TimeStamp < ut2.Timestamp
WHERE ut2.UsertransactionID IS NULL
AND ut1.TransactionID = 1
答案 1 :(得分:1)
@Kickstart是正确的,尽管查询需要修改:
SELECT ut1.UserID
ut1.transactionID,
ut1.Timestamp
FROM Usertransaction ut1
LEFT OUTER JOIN Usertransaction ut2
ON ut1.UserID = ut2.UserID
AND ut2.TransactionID = 2
AND ut1.TimeStamp < ut2.Timestamp
WHERE ut1.TransactionID = 1
AND ut2.UsertransactionID IS NULL