SQL返回尚未注销的活动用户

时间:2015-12-23 12:24:31

标签: php mysql sql-server

我一整天都在尝试,但没有成功。我的系统中有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

我分别得到登录结果和注销结果。如何比较这两个语句并检查用户是否仍然登录?

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