首页 > 解决方案 > 如何像在 Excel 中一样在 MySQL 中“填充系列”(线性步长值)?

问题描述

在 Excel 中,使用线性步长值填充系列很简单。我如何在 MySQL 中做到这一点?

(1) SELECT * FROM blog_postswhere postid= 5 ORDER BY rowidASC

我从一个巨大的表中得到这个查询结果:

rowid   postid    Unix_TimeStamp
100     5          1000000000
135     5          1656885375
142     5          1885649882
208     5          1928211766

(2)接下来,我需要改变Unix_TimeStamp的值。我想单独留下第一行(rowid = 100),然后每一行的 Unix_TimeStamp 比前一行的高 100。结果将是:

rowid   postid    Unix_TimeStamp
100     5          1000000000
135     5          1000000100
142     5          1000000200
208     5          1000000300

非常感谢慷慨的回复。

标签: mysqlexcelincrementseriesminimum

解决方案


在 mysql 5.x 中你可以这样做

在 mysql 8 中,您有窗口函数rownumber

架构(MySQL v5.7)

CREATE TABLE blog_posts  (
  `rowid` INTEGER,
  `postid` INTEGER,
  `Unix_TimeStamp` INTEGER
);

INSERT INTO blog_posts 
  (`rowid`, `postid`, `Unix_TimeStamp`)
VALUES
  ('100', '5', '1000000000'),
  ('135', '5', '1656885375'),
  ('142', '5', '1885649882'),
  ('208', '5', '1928211766');

查询 #1

SELECT 
`rowid`, `postid`
,(SELECT MIN(`Unix_TimeStamp`) FROM blog_posts where postid = 5 ) + @rn *100 `Unix_TimeStamp`
 ,@rn := @rn + 1 ronn
FROM blog_posts, (SELECT @rn := 0) a
where postid = 5 
ORDER BY rowid ASC;

| rowid | postid | Unix_TimeStamp | ronn |
| ----- | ------ | -------------- | ---- |
| 100   | 5      | 1000000000     | 1    |
| 135   | 5      | 1000000100     | 2    |
| 142   | 5      | 1000000200     | 3    |
| 208   | 5      | 1000000300     | 4    |



  UPDATE blog_posts bp INNER JOIN (SELECT 
`rowid`, `postid`
,(SELECT MIN(`Unix_TimeStamp`) FROM blog_posts where postid = 5 ) + @rn *100 `Unix_TimeStamp`
 ,@rn := @rn + 1 ronn
FROM blog_posts, (SELECT @rn := 0) a
where postid = 5 
ORDER BY rowid ASC) t1 ON bp.rowid = t1.rowid 

SET bp.Unix_TimeStamp = t1.Unix_TimeStamp;

[View on DB Fiddle](https://www.db-fiddle.com/f/wUqVKNZy96RjR7hTk3md7o/4)

推荐阅读