需要合并(也许是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
请帮助..................................
谢谢。
答案 0 :(得分:1)
您可以使用条件聚合来完成所需的操作:
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
中未聚合的列匹配。答案 1 :(得分:1)
使用条件最小值/最大值,仅在活动为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
子句将您的隐式联接转换为显式内部联接。另外,我在查询中引入了表别名,这使它更易于阅读。
答案 2 :(得分:1)
尝试条件聚合:
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