在实时数据库中查找 MYSQL table 中最后一条记录的下一个最低值

Find the next lowest value than the last record in a MYSQL table in a real time DB

我有一个简单的 table 可以跟踪视频文件和一个 program_id 数字,如下所示:

|--------------------|----------------|-------- ----------|
|编号 |文件名 | program_id |
|--------------------|----------------|-------- ----------|
| 1 | vid1.mp4 | 1001 |
|--------------------|----------------|-------- ----------|
| 2 | vid2.mp4 | 1010 |
|--------------------|----------------|-------- ----------|
| 3 | vid3.mp4 | 1005 |
|--------------------|----------------|-------- ----------|

我想做的是提取最低的程序 ID,然后从数据库中提取下一个最低的程序 ID。 program_id 不是线性的,因为我在它们之间插入和删除视频,因此循环代码可以提取下一个最低视频,以防添加新视频。所以在第一遍我希望期望 1001,下一遍 1005 然后下一遍 1010.

现在我成功地得到了这个,我可以在 python 中拉到最低的 program_id:

while true:
    sql = "SELECT * FROM videos WHERE program_id =  ( SELECT MIN(program_id)  FROM video)"
    cnx.execute (sql)
    result = cnx.fetchall()
    for qq in result:
        id = qq[0]
        filename = qq[1]
        program_id = qq[3]

  playVideo(filename)

有没有办法使用循环并使用最后一个 programn_id 和下一个最低的 select 进行另一个查询?

使用 Limit 和 offset 获取下一个视频

CREATE TABLE videos  (
  `id` INTEGER,
  `filename` VARCHAR(8),
  `program_id` INTEGER
);

INSERT INTO videos 
  (`id`, `filename`, `program_id`)
VALUES
  ('1', 'vid1.mp4', '1001'),
  ('2', 'vid2.mp4', '1010'),
  ('3', 'vid3.mp4', '1005');
✓

✓
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 0;
id | filename | program_id
-: | :------- | ---------:
 1 | vid1.mp4 |       1001
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 1;
id | filename | program_id
-: | :------- | ---------:
 3 | vid3.mp4 |       1005
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 2;
id | filename | program_id
-: | :------- | ---------:
 2 | vid2.mp4 |       1010

db<>fiddle here

i = 0
while true:
    sql = "SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET "+str(i);
    cnx.execute (sql)
    result = cnx.fetchall()
    for qq in result:
        id = qq[0]
        filename = qq[1]
        program_id = qq[3]
    i = i +1
    playVideo(filename)

但是因为你只得到一行,所以你不需要 for 循环。

您还需要一个断点来离开 While 循环,例如当不再有行时。

我真的不明白运行使用单独的查询来获取此处每一行的意义。

您可以简单地 运行 一个查询,为您提供按递增 program_id 排序的视频,然后循环遍历 查询的结果

while true:
    sql = "SELECT * FROM videos ORDER BY program_id"
    cnx.execute (sql)
    result = cnx.fetchall()
    for qq in result:       -- fetch each video, ordered by "programm_id"
        id = qq[0]
        filename = qq[1]
        program_id = qq[3]
        playVideo(filename) -- play this video