Используйте условные минимальные / максимальные значения и учитывайте минимальные значения created_at
только тогда, когда активность равна login
, и наоборот для выхода из системы.Причина, по которой это работает, состоит в том, что значение ELSE
по умолчанию (явно не показано) равно NULL
, которое игнорируется как MIN
, так и MAX
.
SELECT
u.name as 'Agent',
MIN(CASE WHEN a.activity = 'login' THEN a.created_at END) AS 'Login Time'
MAX(CASE WHEN a.activity = 'logout' THEN a.created_at END) AS 'Logout Time'
FROM agent_activities a
INNER JOIN users u
ON a.agent_id = u.id
WHERE
DATE(a.created_at) = CURDATE()
GROUP BY
a.agent_id, u.name
ORDER BY
a.agent_id, u.name;
Некоторые примечания:
Я преобразовал ваше неявное соединение в явное внутреннее соединение с предложением ON
.Кроме того, я ввел в запрос псевдонимы таблиц, что значительно облегчает его чтение.