Получить авторизованного пользователя сейчас MySQL - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть структура таблицы:

enter image description here

Мне нужно получить последнего авторизованного пользователя со статусом «Вход в систему» ​​без последнего статуса «Выход из системы».Как я могу это сделать?

У меня есть запрос:

SELECT * FROM vtiger_loginhistory WHERE status = 'Signed in' ORDER BY login_time DESC LIMIT 1

Но это получил меня последний авторизованный пользователь admin, почему?Если он Signed off.Мне нужно получить Igor, потому что он Signed in последний.

Ответы [ 5 ]

0 голосов
/ 27 февраля 2019

Следующий запрос должен дать желаемый результат

SELECT t.login_id,t.user_name, t.logout_time,t.login_time,t.status
FROM vtiger_loginhistory t
WHERE t.login_id = (
            SELECT MAX(t2.login_id)
            FROM vtiger_loginhistory t2
            WHERE t2.user_name = t.user_name
            GROUP BY t2.user_name
        )
    AND t.status = 'Signed in';

Что мы здесь делаем ..

В подзапросе мы выбираем последний login_id для пользователя

и в основном запросе мы проверяем, является ли status для этого login_id 'Signed in'

0 голосов
/ 27 февраля 2019

Существует много пользователей Signed in и Signed off, пользователь admin вышел из системы, но последний вход более поздний, чем Igor.

Для вас есть 2 решения:

  1. Обновите поток, когда пользователь Signed off просто обновит статус вместо создания новой записи
  2. Сначала создайте временную таблицу top1signedoff и выберите другую, не входящую в top1signedoff

    СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ top1signedoff ВЫБРАТЬ имя пользователя ОТ vtiger_loginhistory ГДЕ статус = 'Подписан' ORDER BY login_time DESC LIMIT 1;

    ВЫБРАТЬ * ОТ vtiger_loginhistory
    ГДЕ пользователь и статус = ВойтиNot IN (ВЫБЕРИТЕ имя пользователя из top1signedoff)
    ЗАКАЗАТЬ по логину_время DESC LIMIT 1

0 голосов
/ 27 февраля 2019

вы можете попробовать ниже, используя not exists

 select t1.* from vtiger_loginhistory t1
 where 
  status = 'Signed in'
 and not exists ( select 1 from vtiger_loginhistory t2 
                  where t2.user_name=t1.user_name 
                  and status = 'Signed off') 
 order by STR_TO_DATE(login_time,'%Y%m%d %h%i') DESC LIMIT 1

я думаю, что ваш столбец login_time не datetime

0 голосов
/ 27 февраля 2019

Вы можете попробовать это: сначала выберите более свежую строку для каждого username и используйте JOIN или другую SELECT, чтобы увидеть, является ли она "in" или "off"

EDIT: концепция такая же, но исправлена ​​благодаря этому ответу

Версия, которую я не до конца понимаю: https://sqltest.net/#464377

SELECT *
FROM vtiger_loginhistory v_l
LEFT JOIN vtiger_loginhistory tmp
    ON (v_l.user_name = tmp.user_name AND v_l.login_time < tmp.login_time)
WHERE tmp.login_time IS NULL AND v_l.status = 'Signed in'
ORDER BY v_l.login_time DESC LIMIT 1

Аналогичный результат сподзапрос, как я описал (кажется медленнее, как объяснено в связанном ответе): https://sqltest.net/#464385

SELECT *
FROM vtiger_loginhistory v_l
INNER JOIN (SELECT user_name, MAX(tmp.login_time) AS maxlogintime
            FROM vtiger_loginhistory tmp GROUP BY user_name
            ORDER BY login_time DESC) tmp2
    ON (v_l.login_time = tmp2.maxlogintime)
WHERE status = 'Signed in' 
ORDER BY login_time DESC LIMIT 1

РЕДАКТИРОВАННАЯ ОРИГИНАЛЬНАЯ НЕ РАБОЧАЯ ВЕРСИЯ : (потому что GROUP BY сохраняет первую строку выполненной,так что самые старые даты)

SELECT * 
FROM (
    SELECT *
    FROM vtiger_loginhistory 
    GROUP BY user_name
    ORDER BY login_time DESC
) as temp
WHERE status = 'Signed in' 
ORDER BY login_time DESC LIMIT 1
0 голосов
/ 27 февраля 2019

Вы также можете проверить имя пользователя, которого нет в списке, для выхода тоже

SELECT * 
FROM vtiger_loginhistory 
WHERE status = 'Signed in' 
AND username NOT IN (
  select username 
  from vtiger_loginhistory 
  where  status = 'Signed OFF' 
)
ORDER BY login_time DESC LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...