Вы можете попробовать это: сначала выберите более свежую строку для каждого 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