2010-08-18 2 views
1

У меня есть таблица с именем user_logins, которая отслеживает вход пользователя в систему. Он имеет три колонки, login_id, user_id и login_timeСправка по запросу MySQL с группировкой и добавлением

login_id(INT) | user_id(INT) | login_time(TIMESTAMP) 
------------------------------------------------------ 
     1  |  4  | 2010-8-14 08:54:36 
     1  |  9  | 2010-8-16 08:56:36 
     1  |  9  | 2010-8-16 08:59:19 
     1  |  3  | 2010-8-16 09:00:24 
     1  |  1  | 2010-8-16 09:01:24 

Я ищу написать запрос, который будет определять количество уникальных входов на каждый день, если в этот день есть логин и только в течение последних 30 дней текущую дату. Таким образом, для вывода должен выглядеть следующим образом

logins(INT) | login_date(DATE) 
--------------------------- 
    1  | 2010-8-14 
    3  | 2010-8-16 

в таблице результатов 2010-8-16 имеют только 3, потому что user_id 9 вошел в два раза в этот день и его вход в систему только считается 1 входом в этот день , Я ищу только уникальные логины для определенного дня. Помните, что мне нужны только последние 30 дней, чтобы это было как моментальный снимок последнего месяца входа пользователя в систему для системы.

Я попытался создать запрос с небольшим успехом, что я до сих пор это,

SELECT 
    DATE(login_time) as login_date, 
    COUNT(login_time) as logins 
FROM 
    user_logins 
WHERE 
    login_time > (SELECT DATE(SUBDATE(NOW())-1)) FROM DUAL) 
    AND 
    login_time < LAST_DAY(NOW()) 
GROUP BY FLOOR(login_time/86400) 

Я знаю, что это не так, и это возвращает все логины только начиная с начала текущего месяца и Безразлично «Группируйте их правильно. Некоторое руководство по поводу того, как это сделать, будет с благодарностью оценено. Спасибо

+0

Ваш ИНЕКЕ, кажется, отличается от того, что спрашивает ваш вопрос, который правильно - ИНЕКЕ в. запрос или вопрос? –

+0

вопрос, я знаю, что запрос неверен – IamBanksy

+0

Мне нужно изменить запрос, чтобы сделать то, что я описываю в вопросе – IamBanksy

ответ

0

Вы должны использовать COUNT(DISTINCT ...):

SELECT 
    DATE(login_time) AS login_date, 
    COUNT(DISTINCT login_id) AS logins 
FROM user_logins 
WHERE login_time > NOW() - interval 30 day 
GROUP BY DATE(login_time) 

Я был немного не уверен, что вы хотели для вашего ИНЕКЕ, потому что ваш вопрос, кажется, противоречит себе. Возможно, вам придется изменить предложение WHERE в зависимости от того, что вы хотите.

+0

, спасибо, что мне просто нужно было отсортировать дату. – IamBanksy

+0

@IanBanksy : Если вы еще этого не сделали, нажмите «Обновить» и посмотрите, обновлен ответ. –

+0

Большое вам спасибо, отлично работал. – IamBanksy

0

Как Марк говорит вы можете использовать COUNT (DISTINCT ...

В качестве альтернативы:

SELECT login_day, COUNT(*) 
FROM (
    SELECT DATE_FORMAT(login_time, '%D %M %Y') AS login_day, 
     user_id 
    FROM user_logins 
    WHERE login_time>DATE_SUB(NOW(), INTERVAL 1 MONTH) 
    GROUP BY DATE_FORMAT(login_time, '%D %M %Y'), 
     user_id 
) 
GROUP BY login_day 
Смежные вопросы