2012-03-05 1 views
3

次のようなユーザーIDが&のテーブルがあります。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

5

、管理者アカウント用として

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

を試してみてください?管理者アカウントがログインしたときに特別なケースが実行されますか?

+0

ログインタイムスタンプは、内部Webサイトへのログインリダイレクトの完了時にログインテーブルに追加されます。 – Kristian

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