如何在MYSQL查询中使用汇总函数联接表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MYSQL查询中使用汇总函数联接表?相关的知识,希望对你有一定的参考价值。

我有两个数据库表,我想获取每个ID的最新状态。尝试添加INNER JOIN子句,但无济于事。这些就是我的数据:

表:员工

id   name   department
-------------------------
1    A       X
2    B       Y
3    C       Z

表:时间日志

id   time       status    count
-------------------------------
1    08:51       IN       1
3    09:00       OUT      2
2    09:00       IN       3
2    18:00       OUT      4
1    18:05       OUT      5

当前,这是我使用的查询,但需要获取每个雇员的姓名。

SELECT 
     *
FROM timelog
WHERE timelog.count
IN   (SELECT MAX(timelog.count)
      FROM timelog
      GROUP BY timelog.id) 
ORDER BY clock.id;

当前输出:

id   time       status
-------------------------------
1    18:05      OUT
2    18:00      OUT
3    09:00      OUT

这是我想要实现的输出:

id   name      time       status
-------------------------------
1    A         18:05      OUT
2    B         18:00      OUT
3    C         09:00      OUT

是否可以将JOIN添加到上述查询中?如果没有,那将是什么解决方法?任何帮助将不胜感激。 TIA。

答案

使用相关子查询获取id中每个timelog的最后一条记录:

SELECT e.*, tl.*
FROM employee e JOIN
     timelog tl
     ON e.id = tl.id
WHERE tl.count = (SELECT MAX(tl2.count)
                  FROM timelog tl2
                  WHERE tl2.id = tl.id
                 ) ;

请注意,您的查询版本不正确。子查询返回每个ID的最大计数。但是,外部查询可能会将different id与子查询中的计数匹配。相关子句解决了此问题。

另一答案

您可以联接表并使用correlated子查询进行过滤:

select 
    e.id,
    e.name,
    t.time,
    t.status
from employee e
inner join timelog t on t.id = e.id
where t.count = (
    select max(count)
    from timelog t1
    where t1.id = t.id
)

以上是关于如何在MYSQL查询中使用汇总函数联接表?的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句汇总(终篇)—— 表联接与联接查询

Mysql表连接查询

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥

有没有办法改进这个查询

Mysql 表连接查询

mysql 联接查询算法之Block Nested-Loop Join(BNL) 二