在sql中显示每个用户的最后一个值(fast)

wbrvyc0a  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(358)

我试图找出用户在过去24小时内的最后一个动作是在里面还是在外面(这是一个软件,用于在紧急情况下知道哪些人还在大楼里)。这个表有大约200万行,我们有大约3000个用户。
我找到的唯一解决方案是下面的一个,它的工作,但问题是它需要15秒。。。

SELECT TIME, firstname, lastname, dept
FROM DAY
WHERE event_point_id IN (20, 22, 24, 26, 28, 30)
  AND id IN (SELECT MAX(id)
             FROM DAY
             GROUP BY pin)
GROUP BY pin
ORDER BY TIME ASC

day是一个包含以下详细信息的视图

SELECT id, pin, event_point_id, time, firstname, lastname, dept
FROM acc_monitor_log
WHERE (((TO_DAYS(NOW()) - TO_DAYS(time)) < 1) AND (pin <> '--'))

有什么办法可以加快这一进程?

zvms9eto

zvms9eto1#

首先,我将使用相关子查询并除去 GROUP BY :

SELECT d.TIME, d.firstname, d.lastname, d.dept
FROM DAY d
WHERE d.event_point_id IN (20, 22, 24, 26, 28, 30) AND
      d.id = (SELECT MAX(d2.id)
              FROM Day d2
              WHERE d2.pin = d.pin
             )
ORDER BY TIME ASC;

然后,确保在基础表上有索引 acc_monitor_log(pin, id) 以及 acc_monitor_log(event_point_id, pin, id) .

njthzxwz

njthzxwz2#

如果我理解正确,你的 DAY 视图已经在筛选过去24小时的条目,您只需要从该视图中为每个用户获取最新的行。
如果这是正确的,像这样简单的事情应该做的技巧,应该比 IN 在我看来。

SELECT MAX(TIME), pin, firstname, lastname, dept
FROM DAY
WHERE event_point_id IN (20, 22, 24, 26, 28, 30)
GROUP BY pin, firstname, lastname, dept
ORDER BY TIME ASC
qybjjes1

qybjjes13#

第一个建议是使用内部连接减少in子句

SELECT TIME,firstname,lastname,dept
  FROM DAY
  INNER JOIN (
    SELECT pin, MAX(id) max_id 
    FROM DAY
    GROUP BY pin)
  ) T on t.max_id = DAY.id and t.pin = day.pin
  WHERE event_point_id IN (20,22,24,26,28,30)
  ORDER BY TIME ASC

或者

SELECT TIME,firstname,lastname,dept
  FROM DAY
  INNER JOIN (
    SELECT pin, MAX(id) max_id 
    FROM DAY
    GROUP BY pin)
  ) T on t.max_id = DAY.id and t.pin = day.pin
  INNER JOIN (
    select 20 as my_point from dual
    union 
    select 22 from dual
     union 
    select 24 from dual       
    union 
    select 26 from dual
    union 
    select 28 from dual  
    union 
    select 30 from dual      
  ) t2  on t2.my_point  = DAY.event_point
  ORDER BY TIME ASC

确保你有合适的索引。。在列(pin,id)上,您还可以尝试添加一个适当的表,该表的值为20….30,使用索引而不是in子句或子查询,并在此表上使用联接

相关问题