inkognito_23
@inkognito_23
Начинающий разработчик

Количество записей подряд?

Здравствуйте! Никак не могу разобраться, как построить запрос. Есть таблица: date, user_id, status (пара date + user_id уникальна), в которую ежедневно пишутся данные. Т.е. для каждого сотрудника ежедневно сохраняется его статус (1 = активен, 0 = не активен).
Стоит задача вывести количество дней ПОДРЯД (начиная от последней записи по каждому сотруднику) - если последняя запись активен - то сколько дней ПОДРЯД сотрудник активен, если блокирован - то сколько дней ПОДРЯД блокирован.
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 3
slo_nik
@slo_nik
Доброе утро.
Можно получить таким образом разницу между датами.
Получаем разницу между датой регистрации пользователя и датой, когда он последний раз редактировал свой профиль.
SELECT `username`, DATEDIFF(FROM_UNIXTIME(`updated_at`), FROM_UNIXTIME(`created_at`)) AS `date_diff` FROM `user`


В результате получим следующее:
Array
(
    [0] => Array
        (
            [username] => admin
            [date_diff] => 261
        )

    [1] => Array
        (
            [username] => Denis
            [date_diff] => 73
        )

    [2] => Array
        (
            [username] => Vitaliy
            [date_diff] => 80
        )

    [3] => Array
        (
            [username] => Elena
            [date_diff] => 78
        )

    [4] => Array
        (
            [username] => Boris
            [date_diff] => 0
        )

    [5] => Array
        (
            [username] => Daniel
            [date_diff] => 0
        )

    [6] => Array
        (
            [username] => Vladimir
            [date_diff] => 42
        )

    [7] => Array
        (
            [username] => Vasya
            [date_diff] => 0
        )

    [8] => Array
        (
            [username] => Anton
            [date_diff] => 0
        )

    [9] => Array
        (
            [username] => Nicolay
            [date_diff] => 5
        )
)


Или получим разницу между текущей датой и датой регистрации пользователя
SELECT `username`, DATEDIFF(CURDATE(), FROM_UNIXTIME(`created_at`)) AS `date_diff` FROM `user`


В результате получим следующее:
Array
(
    [0] => Array
        (
            [username] => admin
            [date_diff] => 794
        )

    [1] => Array
        (
            [username] => Denis
            [date_diff] => 616
        )

    [2] => Array
        (
            [username] => Vitaliy
            [date_diff] => 515
        )

    [3] => Array
        (
            [username] => Elena
            [date_diff] => 315
        )

    [4] => Array
        (
            [username] => Boris
            [date_diff] => 215
        )

    [5] => Array
        (
            [username] => Daniel
            [date_diff] => 200
        )

    [6] => Array
        (
            [username] => Vladimir
            [date_diff] => 175
        )

    [7] => Array
        (
            [username] => Vasya
            [date_diff] => 150
        )

    [8] => Array
        (
            [username] => Anton
            [date_diff] => 149
        )

    [9] => Array
        (
            [username] => Nicolay
            [date_diff] => 149
        )

)

Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `user_id`, ABS(DATEDIFF(`t0`.`date`, `t1`.`date`)) AS `days`
  FROM (
    SELECT `user_id`, MAX(`date`) as `date`
      FROM `table`
      WHERE `status` = 0
      GROUP BY `user_id`
  ) AS `t0`
  JOIN (
    SELECT `user_id`, MAX(`date`) as `date`
      FROM `table`
      WHERE `status` = 1
      GROUP BY `user_id`
  ) AS `t1` USING `user_id`
Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
1. Получить текущий статус пользователя
2. Получить максимальную дату этого пользователя с другим статусом
3. Посчитать разницу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы