За последние 24 часа нас посетили 17737 программистов и 1647 роботов. Сейчас ищет 851 программист ...

Прошу помочь с запросом

Тема в разделе "MySQL", создана пользователем NeOPS, 4 июн 2015.

  1. NeOPS

    NeOPS Активный пользователь

    С нами с:
    30 авг 2008
    Сообщения:
    19
    Симпатии:
    0
    Есть таблица вида:

    id, user_id, time

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

    использовал запрос SELECT count(*) as count, time FROM `login_history` GROUP BY day(time), month(time), year(time) ORDER by time desc LIMIT 30

    но тут получаются не уникальные логины. как добавить дополнительную группировку по user_id чтобы на выводе получить результат: количество логинов, дата ?
     
  2. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Для получения числа логинов каждого пользователя за последний месяц нужно
    1) добавить группировку по полю user_id
    GROUP BY user_id , ....
    2) добавить условие
    where time > текущее время минус 1 месяц
    3) убрать LIMIT 30
     
  3. NeOPS

    NeOPS Активный пользователь

    С нами с:
    30 авг 2008
    Сообщения:
    19
    Симпатии:
    0
    тогда почему-то нет группировки по дню, месяцу и году

    [​IMG]

    SELECT count(*) as count, time, user_id FROM `login_history` GROUP BY day(time), month(time), year(time), user_id ORDER by time desc
     
  4. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    1) нужно изменить порядок группировки
    GROUP BY user_id, year(time), month(time), day(time)
    2) группировка не по полю time. Поэтому time нельзя и бессмысленно использовать в SELECT

    SELECT count(*) as count, user_id, year(time), month(time), day(time)

    3) тип поля time какой?
     
  5. NeOPS

    NeOPS Активный пользователь

    С нами с:
    30 авг 2008
    Сообщения:
    19
    Симпатии:
    0
    изменил порядок - тоже самое, тип поля timestamp, только по дате группируется нормально, а вот c user_id как на скриншоте выше
     
  6. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Код (PHP):
    1. SELECT count(*) as count, user_id, year(time), month(time), day(time)  FROM `login_history` GROUP BY user_id, year(time), month(time), day(time) 
    2.  
    Этот запрос получает количество записей/логинов в таблице `login_history` относящихся к каждому пользователю по дням

    Если же нужно получить количество логинов по дням без привязки к пользователям, то группировка по user_id не нужна:
    Код (PHP):
    1. SELECT count(*) as count,  year(time), month(time), day(time)  FROM `login_history` GROUP BY year(time), month(time), day(time) 
    2.  
    Добавлено спустя 39 минут 31 секунду:
    если же нужно получить количество пользователей залогинившихся за день то запрос такой:
    Код (PHP):
    1. SELECT count(distinct(user_id)) as count,  year(time), month(time), day(time)  FROM `login_history` GROUP BY year(time), month(time), day(time)
    2.  
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]