繁体   English   中英

MYSQL根据输入日期选择最后两个输入块

[英]MYSQL select last two blocks of entries based on entry days

我有一个表,一天中有多个条目。 我想要最后两组条目。

价值| timeIn | ID

在此处输入图片说明

select * from db.table t
where t.r_id = 76703
order by timeIn DESC
LIMIT 2

我想按timeIn(时间列)添加一个组,但显示其中的各个行。 限制2是我要两个小组。 (基本上是从表格中获取右侧ID的最后两个(今天的最早日期)值组

有多种获取指定结果集的方法。

据我了解,您要用不同的语言来重新声明该规范:您要从表中找到第二高的(不同的) timeIn值(对于r_id的给定值),然后您要从中返回所有行timeIn值大于或等于第二高的timeIn值的表(对于r_id的给定值)。 “集合”是指具有匹配的r_idtimeIn值的行的集合。 (我完全有可能误解了规范。)

这是获取指定行的一种方法:

SELECT d.value
     , d.timeIn
     , d.r_id
  FROM mytable d
 WHERE d.r_id = 76703
   AND d.timeIn >=
       ( SELECT MAX(m2.timeIn) AS m2_timeIn
           FROM mytable m2
          WHERE m2.r_id = 76703
            AND m2.timeIn < 
                ( SELECT MAX(m1.timeIn) AS m1_timeIn
                    FROM mytable m1
                   WHERE m1.r_id = 76703
                )
       )
 ORDER BY d.timeIn DESC, d.value ASC

注意

由于相等谓词和范围扫描,此查询的性能将取决于前导r_idtimeIn的索引。

... ON mytable (r_id, timeIn, ... )

一个EXPLAIN将显示在该计划中的步骤。 MySQL应该首先运行最里面的查询,以获得第一个最高的timeIn值。 然后,MySQL应针对m2运行查询,以获取第二高的timeIn值。 以此作为常量,MySQL应针对d运行查询以获取...


跟进

同样,重要的是,带字面量76703的谓词应位于外部查询和子查询中。 (在那里存在将它们变成相关子查询的诱惑,用更高查询中的引用替换文字...但是出于性能考虑,您不想这样做(因为MySQL处理相关子查询的方式。)在小型机器上没有发现问题,但是在大型机器上,性能损失变得明显,而在大型机器上,性能变得难以忍受。

为了只获取两个最高的值, MAX(foo) WHERE foo < (SELECT MAX(foo)方法可能是最有效的。显然,可以将其扩展为3、4等。

但是要获得上百个最大值,SQL将变得笨拙。

获得第n个最大值的另一种方法是使用类似以下的查询:

SELECT mn.timeIn
  FROM mytable mn
 WHERE mn.r_id = 76703
 GROUP BY mn.timeIn
 LIMIT n-1 ,1

其中n-1表示要跳过的“最高”值的数量。 (例如,要获得第10个最高值,您可以指定LIMIT 9,1 。)

请注意,如果timeIn至少没有“ n”个不同的值,则此查询将不会返回行(对于第一个查询中使用的方法也是如此)。

您可以执行以下操作:

 Select * from db.table t
 where t.r_id = 76703
 AND timeIn >= (select distinct timeIn from db.table t
                WHERE r_id = 76703  
                ORDER BY timeIN desc LIMIT 1, 1)

子查询从唯一的timeIns中以降序选择第二项,而外部查询选择timeIn大于或等于该记录的所有记录。

这可能有效...

   select * from db.table t
   where timeIn<=select timeIn from db.table order by  timeIn DESC limit 1 
        or
        time>=(select timeIn from db.table 
              where time<(select timeIn from db.table order by  timeIn DESC limit 1) 
              order by  timeIn DESC limit 1 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM