Запрос, чтобы получить количество входов в систему пользователя в течение установленного интервала времени от предыдущего входа - PullRequest
1 голос
/ 19 февраля 2020

Я хочу узнать, сколько раз пользователь входит в систему, скажем, через 5 часов после предыдущего входа в систему.

Так что-то вроде new_login - old_login < 5 hours.

Таблица входа будет иметь user_id и time_accessed.

Этот запрос предназначен для получения количества входов пользователя в систему. день. Я не могу понять, как сравнивать разное время в одном и том же столбце в одном выражении:

SELECT user_id, date(time_accessed), count(user_id) AS login_within_5_hour_period
FROM login
GROUP BY user_id, date(time_accessed)
ORDER BY time_accessed;

Пример ввода

+---------+---------------------+
| user_id |    time_accessed    |
+---------+---------------------+
| 1       | 2020-02-19 09:00:00 |
| 1       | 2020-02-19 12:00:00 |
| 1       | 2020-02-19 13:00:00 |
| 1       | 2020-02-19 19:00:00 |
+---------+---------------------+

Выход образца

+---------+---------------------+----------------------------+
| user_id | date(time_accessed) | login_within_5_hour_period |
+---------+---------------------+----------------------------+
| 1       | 2020-02-19          | 3                          |
| 1       | 2020-02-19          | 1                          |
+---------+---------------------+----------------------------+

1 Ответ

1 голос
/ 20 февраля 2020

Чтобы сравнить разные времена, вам нужно объединить таблицу с самим собой.

Следующий запрос найдет количество входов пользователя в систему в течение 5 часов, , исключая текущий авторизоваться. Если вы хотите включить текущий счет в число, измените это l1.time_accessed > l2.time_accessed на l1.time_accessed >= l2.time_accessed.

SELECT l1.user_id, l1.time_accessed, COUNT(l2.user_id) AS login_within_5_hour_period
FROM logins l1
LEFT JOIN logins l2
    ON l1.user_id = l2.user_id
    AND l1.time_accessed > l2.time_accessed
    AND TIME_TO_SEC(TIMEDIFF(l1.time_accessed, l2.time_accessed)) / 3600 <= 5
GROUP BY l1.user_id, l1.time_accessed;

Этот второй запрос вернет один результат, показывающий количество входов пользователя в систему в течение 5 часы указанного времени.

SELECT l1.user_id, l1.time_accessed, COUNT(l2.user_id) AS login_within_5_hour_period
FROM logins l1
LEFT JOIN logins l2
    ON l1.user_id = l2.user_id
    AND l1.time_accessed > l2.time_accessed
    AND TIME_TO_SEC(TIMEDIFF(l1.time_accessed, l2.time_accessed)) / 3600 <= 5
WHERE l1.time_accessed = '2020-02-19 19:00:00'
GROUP BY l1.user_id, l1.time_accessed;

Рабочий пример: https://www.db-fiddle.com/f/g7jDYqoKn38iQTFuPjej9m/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...