如何在 MySQL 中像在 Excel 中那样 "Fill Series"(线性步长值)?
How to "Fill Series" (Linear step value) in MySQL like in Excel?
在Excel中,用线性步长值填充序列很简单。我如何在 MySQL 中做到这一点?
(1) SELECT * FROM blog_posts
where postid
= 5 ORDER BY rowid
ASC
我从一个巨大的 table:
中得到这个查询结果
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
非常感谢慷慨的回复。
在mysql 5.x中你可以这样做
在 mysql 8 中你有 window 函数 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
设置 bp.Unix_TimeStamp = t1.Unix_TimeStamp;
[View on DB Fiddle](https://www.db-fiddle.com/f/wUqVKNZy96RjR7hTk3md7o/4)
在Excel中,用线性步长值填充序列很简单。我如何在 MySQL 中做到这一点?
(1) SELECT * FROM blog_posts
where postid
= 5 ORDER BY rowid
ASC
我从一个巨大的 table:
中得到这个查询结果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
非常感谢慷慨的回复。
在mysql 5.x中你可以这样做
在 mysql 8 中你有 window 函数 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
设置 bp.Unix_TimeStamp = t1.Unix_TimeStamp;
[View on DB Fiddle](https://www.db-fiddle.com/f/wUqVKNZy96RjR7hTk3md7o/4)