[英]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_id
和timeIn
值的行的集合。 (我完全有可能误解了规范。)
这是获取指定行的一种方法:
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_id
和timeIn
的索引。
... 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.