MySQL:在表中选择第一条记录,最后一条记录和 200 条均匀间隔的记录

Posted

技术标签:

【中文标题】MySQL:在表中选择第一条记录,最后一条记录和 200 条均匀间隔的记录【英文标题】:MySQL: Select first record, last record and 200 evenly spaced records in-between in table 【发布时间】:2015-10-21 11:00:29 【问题描述】:

我有一个 mysql 值表,其中包含从数据记录设备收集的 10.000 多条记录。 该表包含以下列:

––––––––––––––––––––––––––––––
| ID  |  Time  | par1 | par2 |
––––––––––––––––––––––––––––––
|  0  |   ..   |  ..  |  ..  |
 ––––––––––––––––––––––––––––––
|  1  |   ..   |  ..  |  ..  |
––––––––––––––––––––––––––––––

.. 等等。

ID 是自动递增的。 我想在表格中查询要绘制的值,所以我对选择所有 10.000 多条记录不感兴趣。

如果可能的话,我想用一个 MySQL 查询选择第一条记录、最后一条记录和 200 条间隔均匀的记录,以便将结果传递给我的绘图算法。

我见过其他类似的解决方案,其中从 (1,2,3.. 等) 开始的每 n 行都被选中,如下所述: How to select every nth row in mySQL starting at n

到目前为止,我已经完成了选择第一条记录 + 200 条均匀间隔的记录

set @row:=-1;
set @numrows := (SELECT COUNT(*) FROM mytable);
set @everyNthRow := FLOOR(@numrows / 200);

SELECT r.*
FROM ( 
     SELECT *
       FROM mytable
      ORDER BY ID ASC
   ) r
 CROSS
  JOIN ( SELECT @i := 0 ) s
HAVING ( @i := @i + 1) MOD @everyNthRow = 1

但我不知道如何包含最后一条记录。

如何做到这一点?

编辑: 此外,在应用所需的逻辑之前,我想检查表是否实际上包含超过 200 条记录。如果没有,则 select 语句应该只输出每条记录(这样 datalogging-session 的前 200 个条目也会出现)。

【问题讨论】:

我猜你总是可以添加 UNION 并只选择最后一行 HAVING @i = @numrows OR ( @i := @i + 1) MOD @everyNthRow = 1 #Veljko89,我已经尝试过了,但是当我在上面看到的内容中添加以下命令:'UNION SELECT * FROM plotdata ORDER BY id DESC LIMIT 1' 时,我只得到最后一条记录? 【参考方案1】:

尝试扩展您的 HAVING 子句以包含最后一行。

HAVING ( @i := @i + 1) MOD @everyNthRow = 1 OR @i = @numrows

您可能需要进行试验,因为 @i = @numrows - 1 可能会给出正确的结果。

【讨论】:

以上是关于MySQL:在表中选择第一条记录,最后一条记录和 200 条均匀间隔的记录的主要内容,如果未能解决你的问题,请参考以下文章

在分组结果中选择第一条和最后一条记录 - Oracle 11g

MYSQL中查讯咋查第一条记录!

获取表中存在的每个日期的第一条和最后一条记录号

mysql中如何查询表的第一条和最后一条记录

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?