объединить два отдельных запроса MySQL - PullRequest
0 голосов
/ 27 сентября 2018

необходимо объединить (возможно, UNION ALL) эти два запроса mysql ..

select users.name as 'Agent', min(agent_activities.created_at) as 'Login Time' 
from agent_activities, users
where 
agent_activities.agent_id = users.id 
and date(agent_activities.created_at) = curdate() 
and agent_activities.activity='login' 
group by agent_activities.agent_id 
order by agent_activities.agent_id asc;

select users.name as 'Agent', max(agent_activities.created_at) as 'Logout Time' 
from agent_activities, users
where 
agent_activities.agent_id = users.id 
and date(agent_activities.created_at) = curdate() 
and agent_activities.activity='logout' 
group by agent_activities.agent_id 
order by agent_activities.agent_id asc;

Теперь результат равен

Agent       | Login Time
test Admin  | 2018-09-27 10:26:54
Agent 1     | 2018-09-27 11:43:44
Hari        |  2018-09-27 11:10:41

Agent       | Logout Time
test Admin  | 2018-09-27 11:43:41
Agent 1     | 2018-09-27 11:45:04
ttt         | 2018-09-27 11:21:06
Hari VH     | 2018-09-27 15:18:04

Желаемый результат

Agent       | Login Time           | Logout Time
test Admin  | 2018-09-27 10:26:54  | 2018-09-27 11:43:41
Agent 1     | 2018-09-27 11:43:44  | 2018-09-27 11:45:04
Hari        |  2018-09-27 11:10:41 | 2018-09-27 15:18:04

Пожалуйстапомогите, ..................................

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Используйте условные минимальные / максимальные значения и учитывайте минимальные значения 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.Кроме того, я ввел в запрос псевдонимы таблиц, что значительно облегчает его чтение.

0 голосов
/ 27 сентября 2018

Попробуйте с условной агрегацией:

select users.name as 'Agent', min(case when agent_activities.activity='login' then agent_activities.created_at end) as 'Login Time' ,
max(case when agent_activities.activity='logout' then agent_activities.created_at end) as 'Logout Time'
from agent_activities inner join users
on agent_activities.agent_id = users.id 
and date(agent_activities.created_at) = curdate() 
group by users.name 
order by users.name asc
0 голосов
/ 27 сентября 2018

Вы можете делать то, что хотите, с условным агрегированием:

select u.name as Agent,
       max(case when aa.activity = 'login' then aa.created_at end) as Login_Time,
       max(case when aa.activity = 'logout' then aa.created_at end) as Logout_Time 
from agent_activities aa join
     users u
     on aa.agent_id = u.id 
where aa.created_at >= curdate() and
      aa.created_at < curdate() + interval 1 day
group by u.name 
order by u.name  asc;

Примечания:

  • Никогда не используйте запятые в предложении FROM. Всегда использует правильный, явный синтаксис JOIN.
  • Псевдонимы таблиц облегчают написание и чтение запроса.Используйте сокращения для имен таблиц.
  • Использование функций для столбцов обычно затрудняет использование индексов, поэтому я заменил date(created_at) на более простые сравнения дат.
  • Ваши столбцы GROUP BY должны соответствовать неагрегированнымстолбцы в SELECT.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...