Как «Fill Series» (значение линейного шага) в MySQL, как в Excel? - PullRequest
1 голос
/ 30 апреля 2020

В Excel заполнение рядов линейным шагом является простым. Как это сделать в MySQL?

(1) ВЫБРАТЬ * ОТ blog_posts, где postid = 5 ЗАКАЗАТЬ rowid КАК C

Я получаю этот запрос результат из огромной таблицы:

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

Большое спасибо за щедрые ответы.

1 Ответ

0 голосов
/ 30 апреля 2020

В mysql 5.x вы можете сделать это следующим образом:

В mysql 8 у вас есть оконная функция номер строки

Схема (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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...