Mysql 从规范化表中选择数据
我一直在努力写这个问题,我想今晚我的大脑有点紧张。我有一个表,当一个人执行打卡、打卡、吃午饭、吃午饭回来的动作时,它存储了这个表,我需要为最后一个动作没有打卡的人返回一个所有主要ID的列表,但问题是它需要有点快的查询 表结构:Mysql 从规范化表中选择数据,mysql,sql,datetime,greatest-n-per-group,window-functions,Mysql,Sql,Datetime,Greatest N Per Group,Window Functions,我一直在努力写这个问题,我想今晚我的大脑有点紧张。我有一个表,当一个人执行打卡、打卡、吃午饭、吃午饭回来的动作时,它存储了这个表,我需要为最后一个动作没有打卡的人返回一个所有主要ID的列表,但问题是它需要有点快的查询 表结构: ID | person_id | status | datetime | shift_type ID=此表的主键 person_id=如果他们的状态不等于clock_out,我要返回的id 状态=打卡进入、午餐开始、午餐结束、休息开始、休息结束、打卡离开 datetim
ID | person_id | status | datetime | shift_type
ID=此表的主键
person_id=如果他们的状态不等于clock_out,我要返回的id
状态=打卡进入、午餐开始、午餐结束、休息开始、休息结束、打卡离开
datetime=添加记录的时间
移位类型=不重要
我以前执行此查询的方式是查找在特定时间段内仍在上班的人,但是我需要此查询在任何时间点进行定位。我正在尝试的查询占用了成千上万的记录,速度太慢了
我需要返回最后一个操作未打卡的人的所有主要ID的列表
一个选项使用MySQL 8.0中提供的窗口函数:
select id
from (
select t.*, row_number() over(partition by person_id order by datetime desc) rn
from mytable t
) t
where rn = 1 and status <> 'clock_out'
在早期版本中,一个选项使用相关子查询:
select id
from mytable
where
datetime = (select max(t1.datetime) from mytable t1 where t1.personid = t.person_id)
and status <> 'clock_out'
在进一步研究之后,这就是我的解决方案-
SELECT * FROM (
SELECT `status`,`person_id` FROM `timeclock` ORDER BY `datetime` DESC
) AS tmp_table GROUP BY `person_id`
这是因为它将所有相同的个人ID分组在一起,然后按日期时间排序,并选择最新的。我不确定托管服务器是否在windows上运行,但对于此服务器版本,SELECT在此位置无效,应为、LOCK、TABLE、VALUES,@JayMason:与Windows操作系统无关。但是,它们可以在MySQ中找到。仅8.0;您正在运行哪个版本?MySQL Server 8.0、MySQL Workbench 8.0CE@JayMason:好的,这样就行了。请完全按照提供的方式运行查询。