Чтобы найти пользователей, которые вошли в систему более десяти раз в течение месяца, заканчивающегося прямо сейчас, сделайте это.
SELECT COUNT(*) times_logged_in,
userid
FROM user
WHERE login_time >= NOW() - INTERVAL 1 MONTH
GROUP BY user_id
HAVING COUNT(*)> 10
Чтобы найти пользователей, которые зарегистрировались более десяти раз в любом календарном месяце в вашем столе, сделайте это.
SELECT COUNT(*) times_logged_in,
DATE(DATE_FORMAT(login_time, '%Y-%m-01')) month_beginning,
userid
FROM user
GROUP BY user_id, DATE(DATE_FORMAT(login_time, '%Y-%m-01'))
HAVING COUNT(*)> 10
Хитрость здесь выражение DATE(DATE_FORMAT(login_time, '%Y-%m-01'))
, который преобразует любую метку времени в первый день месяца, в котором оно происходит.
Ваш вопрос упомянул об этом WHERE
условие:
WHERE login_time between DATE_SUB(login_time INTERVAL 1 month) AND login_time
Это ничего интересного не делать, потому что он всегда возвращается правда. Каждый заданный login_time
всегда попадает в указанный вами интервал.
Редактировать: Вы можете GROUP BY MONTH(dt)
если хотите. Но способ, которым я показал это автоматически, составляет годы, а также месяцы, поэтому, на мой взгляд, это намного лучше для точной отчетности.
Другое редактирование: Эта формула дает предыдущее воскресенье для любой заданной даты или метки времени.
FROM_DAYS(TO_DAYS(login_time) -MOD(TO_DAYS(login_time) -1, 7))
Если понедельник первый день недели в вашей юрисдикции, изменить -1
к -2
. Группировка по этой функции превосходит выполнение GROUP BY WEEK(login_time)
, потому что WEEK()
делает странные вещи в начале и конце календарных лет.
Это все написано в более подробно здесь: http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
Является ли 'GROUP BY id' намеренно? Это предотвращает группировку в целом, если речь идет только о одной таблице. Также 'WHERE login_time BETWEEN x AND login_time' по существу' WHERE login_time = login_time', который всегда совпадает. – Caramiriel
Я не понимаю. Вы сохраняете количество попыток входа пользователя в другую таблицу? – karlingen
@karlingen да, его в другой таблице – dasdasd