在获取每个组中第一个元素的查询中删除子查询

时间:2014-03-01 03:37:33

标签: mysql sql hibernate

我有以下查询来获取每个组中的最新行

SELECT s1.* FROM ps s1
JOIN (
   SELECT s2.id FROM ps s2
   WHERE s2.userId = 63
   ORDER BY s2.date DESC
) as a
ON (s1.id = a.id)
GROUP BY s1.name

然而,此查询的执行情况非常糟糕。 是否存在可以摆脱子查询和/或可以完成的任何其他优化的等效查询?

1 个答案:

答案 0 :(得分:1)

您可以使用not exists执行此操作,方法是选择给定name没有更大日期的行:

select ps.*
from ps
where not exists (select 1
                  from ps ps2
                  where ps2.name = ps.name and
                        ps2.userid = 63 and
                        ps2.date > ps.date
                 ) and
      ps.userid = 63;

这适用于ps(name, userid, date)上的索引。