2014-06-12 38 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