2012-03-05 62 views
3

我有一張表,其中包含用戶標識爲&的時間戳,如下所示。MySQL選擇所有尚未登錄30天的用戶

[member id] [timestamp] 
1   1142461087 
1   1339461211 
2   1321280124 
1   1249042100 
3   1308325002 
3   1308259235 

我想返回未登錄30天或更長時間的唯一成員ID的列表。

這是我當前的查詢:

SELECT member_id, login_timestamp 
    FROM logins 
    WHERE login_timestamp <= 1329461087 
    GROUP BY member_id 
    ORDER BY login_timestamp DESC 

我認爲這是正確的,但由於某些原因,在生產,管理用戶的ID顯示在列表中向上,這是不可能的,因爲每天都有管理員日誌上。

回答

4

像這樣的東西應該工作。

SELECT member_id, MAX(login_timestamp) 
FROM logins 
GROUP BY member_id 
HAVING MAX(login_timestamp) <= 1329461087 
ORDER BY MAX(login_timestamp) DESC 
+0

我忘了MAX()的全部內容,只是不知道HAVING。感謝您的解決方案! – Kristian 2012-03-05 03:46:01

5

而不是硬編碼的截止時間,儘量

SELECT ... 
FROM ... 
WHERE login_timestamp <= UNIX_TIMESTAMP((NOW() - INTERVAL 30 DAY)) 
... 

至於您的管理員帳戶 - 什麼時候登錄時間戳得到更新?當管理員帳戶登錄時是否有特殊情況?

+0

登錄時間戳登錄重定向到內部網站完成後添加到登錄表。 – Kristian 2012-03-05 03:07:59

1

您可以帶走所有用戶並刪除在過去30天內登錄的用戶。其結果將是誰沒有在最近30天內登錄的用戶:

select distinct t1.id 
from t t1 
where not exists (
    select * from t t2 
    where t1.id = t2.id and 
    timestamp >= unix_timestamp((curdate() - interval 30 day)) 
) 
+0

幾年後,我偶然發現了這個解決方案。你能否提一下這種特定的方法比簡單地選擇30天內的那些人更有幫助?性能差異有哪些? – Kristian 2017-06-29 14:46:51

相關問題