我想优化查询,但是我不知道该怎么做。这是我要查询的表:

Device table:

Id    || PushId  || created

abc        aaa        10/10/13
def        aaa        10/12/13
efg        abb         9/9/12


我想要的查询如下:我想要获取重复的PushIds并从表中删除两者中最旧的条目。这是我到目前为止的内容(选择而不是删除,因为我仍处于测试阶段)

select m.* from

(select pushId, created
from Device
group by pushId
having count(*) >1)

 as m inner join Device mm on mm.pushId = m.pushId and mm.created = m.created;


这将正确返回应删除的内容,但是它非常非常慢。有更快的方法吗?没有临时表,有没有办法做到这一点?即一次扫描?

编辑:这是MySQL,我错误地在其中放置了MS-SQL标记。道歉的家伙

最佳答案

这将使用@变量提供与MySQL中的row_number()等效的功能。在这里,它会找到每个PushId的所有内容,除了最近的2行

SELECT
      PushId
    , Id
    , created
FROM (
      SELECT
               @row_num :=IF(@prev_value = d.PushId,@row_num+1,1)AS RN
             , d.PushId
             , d.Id
             , d.created
             , @prev_value := d.PushId
      FROM tblDevices d
      CROSS JOIN(SELECT @row_num :=1, @prev_value :='') vars
      ORDER BY
               d.PushId
             , d.created DESC
      ) SQ
WHERE RN > 2
;


您可以通过更改顺序(例如更改为ASC)来查找最旧的记录,从而更改结果。请注意,交叉联接仅用于将2 @ vars“附加”到每一行,并且由于只有一行,因此对实际记录数没有影响。然后在查询中设置变量。

关于mysql - 优化查询,重复具有最旧日期的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24506375/

10-11 22:04
查看更多