2014-06-12 37 views
-3

这里是我的表结构SQL查询返回最近的行每用户

所以我有这些列在我的表:

UserId Location Lastactivity 

假设有4个结果为1的用户名和每个位置都不同。比方说,

index.php, chat.php, test.php, test1.php

。后来也有时间戳。

让我们再添加一个用户ID为4的位置chat.php和任何时间。

时间为timestamp格式。

我想得到它,以便我的sql查询显示来自每个用户标识的一个结果,但只有最新的一个。所以在2中它会显示最近添加到表中的行。另外,我不希望它显示有15分钟或更多分钟前的最后活动的结果。

对于这个例子,我只是显示返回的两行。

有谁知道我该怎么办?

我曾尝试:

SELECT * FROM session WHERE location='chat.php' GROUP BY userid 

返回两个结果,但我相信,如果有它返回一个随机的用户ID多个结果,它也返回具有超过15分钟lastactivity结果。

我用mysql

------更多信息-------

我要在数据库中查询所有行,其中位置= 'chat.php'。我只需要每个用户标识一行,这取决于哪一个是最近提交的。然后我也不想要超过15分钟的任何东西。最后,我想计算返回的行数,并将它们放入一个名为testVar的变量中

请注意帮助。

+1

请发布一个sql提琴 – Hackerman

+0

这是什么意思?怎么样? – user3474238

+0

首先要获得一个SQL手册。为了限制时间范围,你将使用'WHERE'子句。然后,您可以使用“GROUP BY”和“MIN”为任何给定用户选择最新的时间戳。最后,知道用户标识和时间戳,你可以通过表格的“JOIN”来获得剩余的信息。 – LSerni

回答

0

基本上你要找的东西归结为你想要的用户名和位置与最新的时间戳。所以,你想忽略所有最后一次活动不是最大的记录。

Select sum(1) as testVar 
From session s 
Where location='chat.php' 
and datediff(minute, s.lastactivity, getdate()) < 15 
and not exists (Select * 
          From session s2 
          Where s.userid = s2.userid 
          and s2.lastactivity > s.lastactivity); 

对于每条记录,此查询将检查时间戳更近的同一用户是否有其他记录。如果有,我们希望忽略该记录。我们只想要记录具有更近期活动的行不存在。以这种方式来思考它有点奇怪,但逻辑是相同的。

默认情况下,此查询只会为每个用户抓取一行,所以group by不是必需的。 (如果两个记录的时间戳完全相同,这确实会变得有点多毛,在这种情况下,没有记录会被拉回)

+0

不幸的是,我之前的评论依然存在。 \t 我很困惑...我的表名是会话。查询返回后,我想获取返回到一个名为testVar的变量的行数。然后我想从testVar减去一个给我我的最终结果。有人可以通过给我完整的代码来帮助我吗?请提交作为答案,以便我可以标记为正确的,如果它是:) – user3474238

+0

@ user3474238我不太明白testVar是什么。你想为用户的行数(减1)? – Jenn

+0

不,我想查询数据库中所有位置='chat.php'的行。我只需要每个用户标识一行,这取决于哪一个是最近提交的。然后我也不想要超过15分钟的任何东西。最后,我想计算返回的行数,并将它们放入名为testVar的变量 – user3474238