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